问题描述:
给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动可以使 n - 1 个元素增加 1。
示例:
输入:
[1,2,3]输出:
3解释:
只需要3次移动(注意每次移动会增加两个元素的值):[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
解题思路:
n - 1 个元素增加 1 =1个元素减一 相对关系不变 每个元素都减到和最小值相等,则次数最小
第一张方法采用计数器 数组中的数字每减一次 计数器加一 但时间复杂度过高
代码如下:C++
class Solution { public: int minMoves(vector<int>& nums) { int n=nums.size(); if(n==1) { return 0; }
int count=0;
// n - 1 个元素增加 1 =1个元素减一 相对关系不变 每个元素都减到和最小值相等,则次数最小
int min=nums[0];
for(int i=0;i<n;i++)
{
if(nums[i]<min)
{
min=nums[i];
}
}
for(int i=0;i<n;)
{
if(nums[i]>min)
{
nums[i]--;
count++;
}
else
{
i++;
}
}
return count;
}
};
第二种方法 直接采用 数组中的每一个数字与最小值的差值 相加
代码如下:C++
class Solution {
public:
int minMoves(vector<int>& nums)
{
int n=nums.size();
if(n==1)
{
return 0;
}
int count=0;
// n - 1 个元素增加 1 =1个元素减一 相对关系不变 每个元素都减到和最小值相等,则次数最小
int min=nums[0];
for(int i=0;i<n;i++)
{
if(nums[i]<min)
{
min=nums[i];
}
}
for(int i=0;i<n;i++)
{
count=count+(nums[i]-min);
}
return count;
}
};
测试代码以及结果:
int main()
{
vector<int>nums(3);
nums[0]=1;
nums[0]=2;
nums[0]=3;
printf("%d\n",minMoves(nums));
}