力扣300. 最长递增子序列

目录

题目描述

 思路

线性dp的解题思路


 

题目描述

 思路

以[10,9,2,5,3,7,101,18]为例   抛开代码不谈,我们找最长递增子序列的思路是发现先选10,或9后那么 

2,5,7 或2,3,7就不能选了所以我们可以返回直接跳过10,9但计算机很难实现这样的思路即从前往后比较添加递增序列突然发现后面有一段递增序列但由于前面数的限制而不能添加,再回到前面把那个限制添加的数去掉。这样对序列又会产生很多变化,用这样的思路解决这个问题往往过于杂

线性dp的解题思路

     线性dp的题就先定义dp的数组dp[] 然后明确数组以及数组下标代表的含义

   dp[i]表示以nums[i]为结尾的递增子序列的最大个数

  将dp[i]全部都等于1  如果给的数组里的数均不递增难么递增子序列的长度便为1

   从i=1开始遍历

   i->[1,nums.length)   j->[0,i)    让nums[i]与nums[j]进行比较如果nums[i]>nums[j]那就说明nunms[i]可以加在nums[j]后面形成新的序列,新增的序列的长度为nums[j]+1 然后让 求出dp[i]的转移方程

dp[i]=max(dp[i],dp[j]+1)                                                      

class Solution {
    public int lengthOfLIS(int[] nums) {
        int len = nums.length;
        int[] dp = new int[len];//dp[i]记录以nums[i]结尾的最长递增子序列
        Arrays.fill(dp,1);
        int maxLength=1;
        for(int i=1;i<len;i++){
            for(int j=0;j<i;j++){
                if(nums[i]>nums[j]){
                     dp[i]=Math.max(dp[i],dp[j]+1);
                }
            }
            maxLength=Math.max(maxLength,dp[i]);
        }
        
return maxLength;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值