leetcode 453. Minimum Moves to Equal Array Elements
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]
RT:
int maxIndex(int* nums,int numsSize)
{
int max=0;
for(int i=1;i<numsSize;i++)
{
if(nums[i]>nums[max])
{
max=i;
}
}
return max;
}
bool isequal(int* nums,int numsSize)
{
int max=0;
for(int i=1;i<numsSize;i++)
{
if(nums[i]!=nums[max])
{
return false;
}
}
return true;
}
int minMoves(int* nums, int numsSize) {
int flag=1;
int result=0;
if(isequal(nums,numsSize))
{
flag=0;
}
while(flag)
{
int k=maxIndex(nums,numsSize);
for(int i=0;i<numsSize;i++)
{
if(i!=k)
{
nums[i]++;
}
}
result++;
if(isequal(nums,numsSize))
{
flag=0;
}
}
return result;
}
WA:
int maxIndex(int* nums,int numsSize)
{
int max=0;
for(int i=1;i<numsSize;i++)
{
if(nums[i]>nums[max])
{
max=i;
}
}
return max;
}
int minMoves(int* nums, int numsSize) {
if(numsSize==1)
return 0;
int Index=maxIndex(nums,numsSize);
int sum=0;
for(int i=0;i<numsSize;i++)
{
sum+=nums[i];
}
while(nums[Index]>0)
{
if((numsSize*nums[Index]-sum)%(numsSize-1)==0)
{
break;
}
else
{
nums[Index]++;
}
}
return (numsSize*nums[Index]-sum)/(numsSize-1);
}
tips: nums数组里的字[1,1,2147483647] 会出错。 (numsSize*nums[Index]-sum)/(numsSize-1) 对公式需要化简,因为数太大,超过int范围。
WA:
int maxIndex(int* nums,int numsSize)
{
int max=0;
for(int i=1;i<numsSize;i++)
{
if(nums[i]>nums[max])
{
max=i;
}
}
return max;
}
int minMoves(int* nums, int numsSize) {
if(numsSize==1)
return 0;
int Index=maxIndex(nums,numsSize);
int sum=0;
for(int i=0;i<numsSize;i++)
{
sum+=nums[i];
}
while(nums[Index]>0)
{
if((nums[Index]-sum)%(numsSize-1)==0)
{
break;
}
else
{
nums[Index]++;
}
}
return (nums[Index]-sum)/(numsSize-1)+nums[Index];
}
tips: 上式改进后,又WA,要哭了。。。。【-100,0,100】错了。。。
AC:
int maxIndex(int* nums,int numsSize)
{
int max=0;
for(int i=1;i<numsSize;i++)
{
if(nums[i]>nums[max])
{
max=i;
}
}
return max;
}
int min1(int* nums,int numsSize)
{
int min=nums[0];
for(int i=1;i<numsSize;i++)
{
if(min>nums[i])
{
min=nums[i];
}
}
return min;
}
int minMoves(int* nums, int numsSize) {
if(numsSize==1)
return 0;
int minVal=min1(nums,numsSize);
for(int i=0;i<numsSize;i++)
{
nums[i]-=minVal;
}
int Index=maxIndex(nums,numsSize);
int sum=0;
for(int i=0;i<numsSize;i++)
{
sum+=nums[i];
}
nums[Index]=sum;
while(nums[Index]>0)
{
if((nums[Index]-sum)%(numsSize-1)==0)
{
break;
}
else
{
nums[Index]++;
}
}
return (nums[Index]-sum)/(numsSize-1)+nums[Index];
}
tips::感天动地终于过了!!!加了一个格式化数组函数,将数组里的元素全部减去最小值,然后nums[Index]的范围不在是最大值到无穷,而是数组元素和到无穷(避免了最小元素减去sum时出现负数的情况)。