问题
思路
这个题想了半天没想出来。
看了别人的帖子才会的,先把参考的帖子贴出来[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=1xi−xmin=∑i=1xi−n⋅xmin
代码
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;
}
};