先按照题目意思,根据题目要求的步骤,自己写了一个小程序,这样做肯定会超时,对总结规律,很有帮助。
小程序如下:(在第6个用例的时候,果然超时了)
class Solution {
public:
int minMoves(vector<int>& nums) {
long len = nums.size();
if(len == 1)
return 0;
int cnt = 0, diff = 1;
while(diff){
diff = 0;
for(int i = 1; i < len; i++)
diff += nums[i] - nums[i-1];
if(!diff) break;
int max_num = 0, index = 0;
for(int i = 0 ; i < len; i++)
if(nums[i] > max_num){
max_num = nums[i];
index = i;
}
for(int i = 0 ; i < len; i++)
if(i != index)
nums[i]++;
cnt++;
}
return cnt;
}
};
通过总结规律,发现答案其实是:假如数组中最小值为x, 其他元素减去x 的差的和就是答案。
步骤:
1、先找到最小值
2、计算其他元素减去最小值的差的和;
算法复杂度为:o(n)
前面几行是改变c++的输入输出,可以加速输入输出效率,减少的时间还是客观的,可以打败100%的人。
static auto x = []()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
return 0;
}();
class Solution {
public:
int minMoves(vector<int>& nums) {
long len = nums.size();
if(len == 1)
return 0;
int cnt = 0, min_num = INT_MAX;
for(int i = 0; i < len; i++)
min_num = min(min_num, nums[i]);
for(int i = 0; i < len; i++)
if(min_num != nums[i])
cnt += nums[i] - min_num;
return cnt;
}
};
最终运行时间:16ms,小编看见这个题有人还用了排序,就是处理最小值的时候,排序时间复杂度为O(nlong(n)),肯定没有一次遍历O(n)速度快,然后看结果确实是这样。