Leetcode——453. Minimum Moves to Equal Array Elements

来源:互联网 发布:centos vi 保存退出 编辑:程序博客网 时间:2024/05/21 19:24

题目

Given a non-empty integer array of size n, find the minimum number of moves required to make all array elements equal, where a move is incrementing n - 1 elements by 1.

Example:

Input:[1,2,3]Output:3Explanation:Only three moves are needed (remember each move increments two elements):[1,2,3]  =>  [2,3,3]  =>  [3,4,3]  =>  [4,4,4]

解答

第一种方法:
1. 先对数组从小到大进行排序
2. 比较最后一个和第一个是否相等,如果相等就返回结果,不等进行第三步
3. 然后对前n-1个进行++,然后把第n个放到合适的位置
4. 执行第2步
上述方法时间复杂度是O(N^2)
第二种方法:
每次增加n-1个元素,最后结果是所有元素都相等,可以转换思想,就是每次都把最大的元素减去1,最后所有元素都等于最小的元素。
所以进行的操作次数总共是:所有元素相加,减去元素个数*最小的元素。注意有可能溢出,可以把元素相加的和转化为long long类型来保存。

class Solution1 {//超时了public:    int minMoves(vector<int>& nums) {//复杂度O(N^2)        int res=0;        std::sort(nums.begin(),nums.end());//先排序,O(NlogN)        int len=nums.size();        while(nums[len-1]!=nums[0])//最后一个不等于第一个        {            res++;            for(int i=0;i<nums.size()-1;i++)                nums[i]++;            //重新排序            int temp=nums[len-1];            int j=len-1;            while(j>=1&&nums[j-1]>temp)            {                nums[j]=nums[j-1];                j--;            }            nums[j]=temp;        }        return res;    }};class Solution {public:    int minMoves(vector<int>& nums) {//复杂度O(N^2)        long long res=0;        //寻找最小的那个元素        int MinElem=INT_MAX;        for(int i=0;i<nums.size();i++)            if(nums[i]<MinElem)                MinElem=nums[i];        for(int i=0;i<nums.size();i++)            res=res+nums[i];        res=res-(long long)MinElem*(long long)nums.size();        return res;    }};
0 0
原创粉丝点击