【LeetCode】最长递增子序列Java题解

446 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

题目描述

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4

示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-increasing-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路总结

  • 今天的算法题目,需要找到最长严格递增子序列的长度。
  • 采用动态规划的方式解题:dp[i] 的值代表 nums 前 i 个数字的最长子序列长度。初始值 dp[i] 为1。
  • 然后每次遍历 0 到 i - 1 区间,与nums[i]比较大小 ,动态更新dp[i] 的最值。代码如下:

通过代码

class Solution {
    public int lengthOfLIS(int[] nums) {
        int n = nums.length;
        int ans = 0;
        if (n == 0) {
            return ans;
        }

        int[] dp = new int[n];
        dp[0] = 1;
        ans = 1;
        for (int i = 1; i < n; i++) {
            dp[i] = 1;
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
            ans = Math.max(ans, dp[i]);
        }
        return ans;
    }

image.png

总结

  • 上述算法的时间复杂度是O(n * n), 空间复杂度是O(n)
  • 坚持算法每日一题,加油!