这道题的原理是每次数组的n-1个数要加一个值,直到最后所有值相等,增加的值就是当前数组的最大值减最小值的差值。
开始我还每次都把数组算出来,求出每次的最大值和最小值,这样很耗时,结果超时了。
错误做法
class Solution {
public:
int minMoves(vector<int>& nums)
{
int minindex=FindMinIndex(nums);
int maxindex=FindMaxIndex(nums);
int step=0;
while(nums[minindex]<nums[maxindex])
{
int differ=nums[maxindex]-nums[minindex];
step=step+differ;
for(int i=0;i<nums.size();i++)
{
if(i==maxindex)
continue;
nums[i]=nums[i]+differ;
}
minindex=FindMinIndex(nums);
maxindex=FindMaxIndex(nums);
}
return step;
}
int FindMinIndex(vector<int>& nums)
{
int index=0;
int min=nums[0];
for(int i=1;i<nums.size();i++)
{
if(nums[i]<min)
{
index=i;
min=nums[i];
}
}
return index;
}
int FindMaxIndex(vector<int>& nums)
{
int index=0;
int max=nums[0];
for(int i=1;i<nums.size();i++)
{
if(nums[i]>max)
{
index=i;
max=nums[i];
}
}
return index;
}
};
第二种做法:后来想到只要求出数组所右元素减去最小值得累加和,就是要增加的步数。
class Solution {
public:
int minMoves(vector<int>& nums)
{
if(nums.size()==1)
return 0;
int minindex=FindMinIndex(nums);
int moves=0;
for(int i=0;i<nums.size();i++)
{
moves=moves+nums[i]-nums[minindex];
}
return moves;
}
int FindMinIndex(vector<int>& nums)
{
int index=0;
int min=nums[0];
for(int i=1;i<nums.size();i++)
{
if(nums[i]<min)
{
index=i;
min=nums[i];
}
}
return index;
}
};