Leetcode300. 最长上升子序列

151 阅读1分钟

要求:

给定一个无序的整数数组,找到其中最长上升子序列的长度。

示例:

输入: [10,9,2,5,3,7,101,18]
输出: 4 
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

注意:

子序列不同于子数组,并不要求是连续的。

思路:

  • 动态规划,参照labuladong的框架写的
  1. 确定base case:dp数组全部初始化为1,因为最初都为1
  2. 确定状态变量:
  3. 确定选择:
  4. 确定dp函数或dp数组的定义:dp[i]表示以nums[i]为结尾的最长递增子序列的长度。
  • 总体思路: 先明确dp数组的定义;然后根据其定义,假设dp[0...i-1]都已知,运用数学归纳的思想,利用前面的已知项求出dp[i]。dp[i]等于某个dp[n]+1;dp[n]是符合nums[n]<=nums[i]的所有索引下的dp数组中的最大值。

代码:

class Solution {
    public int lengthOfLIS(int[] nums) {
        int[] dp = new int[nums.length];
        Arrays.fill(dp, 1);
        int res = 0;
        for (int i = 0; i<nums.length; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j]) {
                    dp[i] = Math.max(dp[i], dp[j]+1);
                }
            }
        }
        for (int i = 0; i < nums.length; i++) {
            res = Math.max(res, dp[i]);
        }
        return res;
    }
}