给定一个长度为 N 的数列 A1, A2, · · · , AN。现在小蓝想通过若干次操作将这个数列中每个数字清零。
时间: 2024-05-20 09:17:47 浏览: 185
将数字变成 0 的操作次数1
每次操作可以选择一个下标 i,将 Ai 变成 max(0, Ai−1)。也就是说,如果 Ai−1 大于 0,那么可以将它减少 1,否则将 Ai 设为 0。小蓝想知道,最少需要进行多少次操作才能将整个数列清零。
解题思路:
首先考虑一下,如果没有操作的限制,即每次都可以将任意一个数减少 1,那么最少需要几次操作才能将整个数列清零。显然,每次选择最小的非零数减少 1 是最优的。因为我们希望尽可能早地将非零数变成 0,这样才有可能在后续的操作中使用它们。
有了这个结论,我们可以考虑如何在有操作限制的情况下,尽可能地选择最小的非零数减少 1。具体来说,如果 Ai−1 大于 0,那么我们就将 Ai−1 减少 1,否则将 Ai 设为 0。这样做的正确性在于,我们希望尽可能地利用前面已经减少的数,而不是浪费掉它们。
因此,我们可以用一个变量 cnt 记录已经减少的数的个数,从左到右遍历数列,每次如果 Ai 大于 0,就将 Ai−1 减少 1,cnt 加 1,否则不做任何操作。最后返回 cnt 即可。
时间复杂度:O(N)
参考代码:
int minOperations(vector<int>& nums) {
int n = nums.size(), cnt = 0;
for (int i = 1; i < n; i++) {
if (nums[i] > 0) {
cnt += nums[i - 1];
nums[i - 1] = 0;
}
}
return cnt + nums[n - 1];
}
阅读全文