原题:
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]
意思是每次在数列中除最大的那个元素以外都加一,直到所有数一样大,先用暴力办法然后超时了:
class Solution {
public:
int minMoves(vector<int>& nums) {
int cnt=0;
while(1){
int max=0;
bool same=1;
for(int i=0;i<nums.size();i++){
if(same&&nums[i]!=nums[max]){same=0;}
if(nums[i]>nums[max]){max=i;}
}
if(same){break;}
nums[max]--;
cnt++;
}
return cnt;
}
};
不过在打代码时发现这tm根本是一道数学题啊!!!其实其他加一就相当于最大的减一,每次减一直到所有数相同不久都等于最小数了吗,所以只要求出最小数然后求出所有数减最小数的和,只要一个for循环就行了复杂度O(n),结果:
Success
Runtime: 48 ms, faster than 91.33% of C++ online submissions for Minimum Moves to Equal Array Elements.
Memory Usage: 10.8 MB, less than 90.60% of C++ online submissions for Minimum Moves to Equal Array Elements.
代码:
class Solution {
public:
int minMoves(vector<int>& nums) {
int min=nums[0];
long sum=0;
for(int i=0;i<nums.size();i++){
if(nums[i]<min){min=nums[i];}
sum+=nums[i];
}
sum-=min*nums.size();
return sum;
}
};