leetcode-453-Minimum Moves to Equal Array Elements

问题

题目:[leetcode-453]

思路

这个题想了半天没想出来。
看了别人的帖子才会的,先把参考的帖子贴出来[LeetCode453题解]

这个题麻烦主要是麻烦在每次只能是给n-1个元素+1。当然,显然的是每次肯定是最小的n-1个+1。想的到的办法就是模拟。觉得不可取。

看了帖子之后得到的思路是:

  • 每次移动的肯定是最小的n-1个元素。但是这其实是相当于,把最大的元素-1。这一点我没有想到。所以,“移动的过程”可以变为每次把最大元素-1
  • 其次,最后一样的元素肯定是数组中最小的元素。这个可以反证法去证明:假设在t时刻,存在一个元素a比数组中之前的元素小。那么由这个假设我们可以知道,除了a之外的其余元素都是a+1。否则,如果有比a+1大的元素,那么此时应该减去比a+1大的这个元素才行。因为剩下的元素都是a+1,那么可以知道上一个时刻所有元素就已经都是a+1了。即此时已经没有最大元素。不需要减-1。

最后说一下总的次数: ni=1xixmin=i=1xinxmin

代码

class Solution {
public:
    int minMoves(vector<int>& nums) {
        int sz = nums.size();
        int sum = nums[0];
        int min = nums[0];
        for(int i = 1; i < sz; ++i){
            min = (min < nums[i])?min:nums[i];
            sum += nums[i];
        }
        return sum - sz*min;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值