一、题目
给定一个长度为 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++代码实现一
使用*min_element()找数组中的最小值。
class Solution {
public:
int minMoves(vector<int>& nums)
{
int nums_min = *min_element(nums.begin(),nums.end()); //使用min_element找最小值
int result = 0;
for(auto number:nums)
{
result += number-nums_min;
}
return result;
}
};
- C++代码实现二
class Solution
{
public:
int minMoves(vector<int>& nums)
{
int nums_min = INT_MAX,result = 0; //INT_MAX=2^31-1,INT_MIN = -2^31
for(int i = 0;i<nums.size();i++) //找最小值
{
if(nums[i] < nums_min)
nums_min = nums[i];
}
for(auto a:nums) //每个元素减去最小值相加
result += a-nums_min;
return result;
}
};