300. 最长递增子序列

刷题找工作!!!

题目链接

. - 力扣(LeetCode)

自己的思路

dp[i]表示在第n个数字上,现在的最长递增子序列。

如果num[i]大于nums[i],长度再加1,否则继承前面dp[i-1]的最大长度。

class Solution {
    public int lengthOfLIS(int[] nums) {
        int len = nums.length;
        if(len == 1)
        return 1;
        int[] dp = new int[len + 1];
        dp[0] = 0;
        dp[1] = 1;
        for(int i = 2; i <= len ; i++){
            if(nums[i - 1] > nums[i-2]){
                dp[i] = dp[i-1] + 1;
            }else{
                dp[i] = dp[i-1];
            }
            System.out.println(dp[i]);
        }
        
        return dp[len];
    }
}

但想一想,我这样的思路是有问题的,并没有确保整个数列是递增的,只是计算了相邻两个数之间是递增的对数。

看来不能小瞧动态规划题。

正确答案

class Solution {
    public int lengthOfLIS(int[] nums) {
        int len = nums.length;
        if(len == 1)
        return 1;
        int[] dp = new int[len];
        //转变思路,dp[n]一定是满足n这个数存在的
        dp[0] = 1;
        int ans = 1;
        for(int i = 1; i < len;i++){
            dp[i] = 1;
            for(int j = 0; j < i; j ++){
                if(nums[j] < nums[i]){
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
           ans = Math.max(dp[i], ans);
        }
        //最后不是直接输出dp[len - 1]
        //而是遍历所有输出最大值
        return ans;
    }
}

已经理解了,这样看这道题不难,注意3个点

  • dp[i]表示当i算进去子序列时最大的长度
  • 输出最大值而不是dp[len - 1]
  • 不要害怕时间复杂度,O(n^2)也是有可能的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值