您的位置:首页 > 其它

Leetcode——453. Minimum Moves to Equal Array Elements

2017-01-21 16:04 471 查看

题目

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:
3

Explanation:
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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: