牛客题霸-递增数组
牛牛有一个数组array,牛牛可以每次选择一个连续的区间,让区间的数都加1,他想知道把这个数组变为严格单调递增,最少需要操作多少次?
输入:
给定array数组
1 <= array.size <= 2105
1 <= array[i] <= 1109
输出:
返回最小次数
输入
[1, 2, 1, 2]
输出
2
说明
array[2]和array[3]都+2,变成[1,2,3,4],只需两次操作
解
本题采用贪心算法,array[i] 至少比 array[i-1] 多1。
且每次操作时, 惠及array[j] (j >= i)。
过程如下图所示
由图可见,要使方块高度严格递增,每一列至少要达到前一列的高度加一,既然每次操作时是对一个区间加一,不如把这个区间从修改列扩大到末尾,这样后方方块的相对高度没有发生改变,最少的操作次数就是把每一列提高到至少比前一列高1的高度。
class Solution {
public:
long long IncreasingArray(vector<int>& array) {
long long res = 0;
for(int i = 1; i < array.size(); i++) {
res += max(array[i-1] + 1 - array[i], 0);
}
return res;
}
};