674. 最长连续递增序列-day48打卡-代码随想录
674. 最长连续递增序列思路本题相对于昨天的动态规划300.最长递增子序列最大的区别在于“连续”。本题要求的是最长连续递增序列动态规划动规五部曲分析如下确定dp数组dp table以及下标的含义dp[i]以下标i为结尾的连续递增的子序列长度为dp[i]。注意这里的定义一定是以下标i为结尾并不是说一定以下标0为起始位置。确定递推公式如果 nums[i] nums[i - 1]那么以 i 为结尾的连续递增的子序列长度 一定等于 以i - 1为结尾的连续递增的子序列长度 1 。即dp[i] dp[i - 1] 1;注意这里就体现出和动态规划300.最长递增子序列的区别因为本题要求连续递增子序列所以就只要比较nums[i]与nums[i - 1]而不用去比较nums[j]与nums[i] j是在0到i之间遍历。既然不用j了那么也不用两层for循环本题一层for循环就行比较nums[i] 和 nums[i - 1]。这里大家要好好体会一下dp数组如何初始化以下标i为结尾的连续递增的子序列长度最少也应该是1即就是nums[i]这一个元素。所以dp[i]应该初始1;确定遍历顺序从递推公式上可以看出 dp[i 1]依赖dp[i]所以一定是从前向后遍历。本文在确定递推公式的时候也说明了为什么本题只需要一层for循环代码如下for (int i 1; i nums.size(); i) {if (nums[i] nums[i - 1]) { // 连续记录dp[i] dp[i - 1] 1;}}举例推导dp数组已输入nums [1,3,5,4,7]为例dp数组状态如下/** 动态规划 * 1.dp[i] 代表当前下标最大连续值 * 2.递推公式 ifnums[i1]nums[i] dp[i1] dp[i]1 * 3.初始化 都为1 * 4.遍历方向从其那往后 * 5.结果推导 。。。。 * param nums * return */ public static int findLengthOfLCIS(int[] nums) { int[] dp new int[nums.length]; for (int i 0; i dp.length; i) { dp[i] 1; } int res 1; for (int i 0; i nums.length - 1; i) { if (nums[i 1] nums[i]) { dp[i 1] dp[i] 1; } res res dp[i 1] ? res : dp[i 1]; } return res; } // 贪心法 public static int findLengthOfLCIS(int[] nums) { if (nums.length 0) return 0; int res 1; // 连续子序列最少也是1 int count 1; for (int i 0; i nums.length - 1; i) { if (nums[i 1] nums[i]) { // 连续记录 count; } else { // 不连续count从头开始 count 1; } if (count res) res count; } return res; }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2418900.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!