1、初始思路:按照正常思路求解会超出时限
int minMoves(int* nums, int numsSize) {
int m,count2 = 0;
for(m = 0;m < numsSize;m++){
if(nums[m] == nums[0]){
count2++;
}
}
if(count2 == numsSize){
return 0;
} //如果全部相等,则返回 0
if(numsSize == 1 ){
return 0;
}
if(numsSize == 2){
return abs(nums[1] - nums[0]);
} //解决了n取值1和2的情况
int i ,j; //冒泡排序
for(i = 0;i < numsSize-1;i++){
for(j = 0; j < numsSize-1;j++){
if(nums[j] > nums[j+1]){
int temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
bool flag = true;
int count = 0 ,count1 = 0;
while(flag){
int k,n;
for(k = 0;k < numsSize-1;k++){
nums[k]++;
}
int e ,f; //冒泡排序
for(e = 0;e < numsSize-1;e++){
for(f = 0; f < numsSize-1;f++){
if(nums[f] > nums[f+1]){
int temp = nums[f];
nums[f] = nums[f+1];
nums[f+1] = temp;
}
}
}
for(n = 0;n < numsSize-1;n++){
if(nums[n] == nums[numsSize-1]){
count1++;
}
}
if(count1 == numsSize){
flag = false;
}
count++;
}
return count;
}
2、每次除最大值,其他所有值加1一直到所有值都相等,相当于求总和,再减去最小值乘以数组长度,这里利用了逆向思维,其他数加就等效于其中一个数一直减,这样的话就能理解下面简单的程序了。
int minMoves(int* nums, int numsSize) {
int sum = 0;
int min = INT_MAX;
int i;
for ( i = 0; i < numsSize; i++){
if (nums[i] < min){
min = nums[i];
}
sum += nums[i];
}
return sum - min*numsSize;
}