题目描述

image.png

解题思路

DP

本题和最长递增子序列的区别就是递推公式!!!
如果 nums[i + 1] > nums[i],那么以 i+1 为结尾的数组的连续递增的子序列长度 一定等于 以i为结尾的数组的连续递增的子序列长度 + 1 。即:dp[i + 1] = dp[i] + 1;
遍历顺序也只是用一个for来遍历,因为求得是连续的递增子序列,所以只需要判断 i 和 i - 1 即可。

  1. // 动态规划 O(n * n)
  2. // 和lc的300题递增子序列相差不大,300题是没有连载一起,需要在使用一个for循环判断
  3. public int findLengthOfLCIS(int[] nums) {
  4. if (nums.length == 1) {
  5. return 1;
  6. }
  7. int[] dp = new int[nums.length];
  8. int result = 0;
  9. Arrays.fill(dp, 1);
  10. for (int i = 1; i < nums.length; i++) {
  11. if (nums[i] > nums[i - 1]) {
  12. dp[i] = Math.max(dp[i], dp[i - 1] + 1);
  13. }
  14. if (dp[i] > result) result = dp[i];
  15. }
  16. return result;
  17. }

贪心

这道题目也可以用贪心来做,也就是遇到nums[i + 1] > nums[i]的情况,count就++,否则count为1,记录count的最大值就可以了。

  1. // 贪心 O(n)
  2. // 如果i大于i-1,count++,否则count重置
  3. public int findLengthOfLCIS(int[] nums) {
  4. if (nums.length == 1) {
  5. return 1;
  6. }
  7. int count = 1; // 最小连续为1
  8. int result = 1;
  9. for (int i = 1; i < nums.length; i++) {
  10. if (nums[i] > nums[i - 1]) {
  11. count++;
  12. } else {
  13. result = Math.max(result, count);
  14. count = 1;
  15. }
  16. result = Math.max(result, count);
  17. }
  18. return result;
  19. }