一.题目描述
NC531递增数值
牛牛有一个数组array,牛牛可以每次选择一个连续的区间,让区间的数都加1,他想知道把这个数组变为严格单调递增,最少需要操作多少次?
二.算法(贪心)
基于贪心的思想,对于已经递增的区间我们不应该去处理,为了减少后面的操作次数,所以对于整个数组我们需要进行一次遍历,只需要处理非递增的区间就可以解决问题,下面是完整代码:
class Solution { public: long long IncreasingArray(vector<int>& array) { long long ans=0;//ans返回最后的返回次数 for(int i=0;i<array.size()-1;i++){ ans+=max(0,array[i]+1-array[i+1]); } return ans; } };
时间复杂度:只需要对数组进行一次遍历即可
空间复杂度:不需要额外空间返回答案
优缺点:基于贪心实现,思路清晰,代码简单。
三.算法(java实现)
思路和算法二相似,都是基于贪心的思想,下面是完整代码:
import java.util.*; public class Solution { public long IncreasingArray (int[] array) { long sum=0; for (int i = 1; i < array.size(); ++i) { if (array[i] <= array[i-1]) { sum+=array[i-1]-array[i] + 1; } } return sum; } }
时间复杂度:只需要对数组进行一次遍历即可
空间复杂度:不需要额外空间返回答案
优缺点:基于贪心实现,思路清晰,代码简单。