leetcode-453-Minimum Moves to Equal Array Elements

来源:互联网 发布:网络对大学生的好处 编辑:程序博客网 时间:2024/06/05 07:14

问题

题目:[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;    }};
0 0
原创粉丝点击