题解 | #递增数组#
递增数组
http://www.nowcoder.com/practice/d0907f3982874b489edde5071c96754a
题目描述
牛牛有一个数组array,牛牛可以每次选择一个连续的区间,让区间的数都加1,他想知道把这个数组变为严格单调递增,最少需要操作多少次?
方法一:贪心思想求解
求解思路
对于本题目要求整个数组为严格单调递增数组,那么数组的局部肯定都是递增的,否则这个数组不是递增数组。我们对数组的递减部分进行处理,采用贪心的思想进行元素交换,是的递减的部分变为递增,这样一步步地操作,最终即可得出本题的答案。
解题代码
import java.util.*; public class Solution { public long IncreasingArray (int[] array) { long myres=0; // 声明变量,记录结果 for(int i=1;i<array.length;i++) { //当第i个数比第i-1个数小时,它所要加的次数是a[i]-a[i-1]+1 if(array[i]<array[i-1]) myres+=array[i-1]-array[i]+1; } return myres; // 返回结果 } }
复杂度分析
时间复杂度:一层循环,因此时间复杂度为
空间复杂度:没有引入额外的内存地址空间,因此空间复杂度为
方法二:动态规划思想求解
求解思路
对于本题目我们可以采用动态规划思想来进行求解,我们定义dp[i]表示从递减区间到递增区间所需要的最少操作次数,当所有的递减区间都变为单调增区间之后,我们对dp数组进行求和,即可得到本题目的答案。
解题代码
import java.util.*; public class Solution { public long IncreasingArray (int[] array) { long myres=0; // 声明结果 long[]mydp=new long[array.length]; for(int i=1;i<array.length;i++) { //当第i个数比第i-1个数小时,它所要加的次数是a[i]-a[i-1]+1 if(array[i]<array[i-1]) mydp[i-1]=array[i-1]-array[i]+1; } for(int i=0;i<mydp.length;i++) { //操作次数之和为最终结果 myres+=mydp[i]; } return myres; // 返回结果即可 } }
复杂度分析
时间复杂度:一层循环,因此时间复杂度为
空间复杂度:使用数组dp[N],使用额外的内存地址空间,因此空间复杂度为
算法 文章被收录于专栏
算法题的题解以及感受