Leetcode300. 最长上升子序列

Longest Increasing Subsequence
Given an unsorted array of integers, find the length of longest increasing subsequence.
Example:
Input: [10,9,2,5,3,7,101,18]
Output: 4
Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4.

分析:首先仔细审题,明确题目中的条件。
1、子序列:不要求连续子序列,只要保证元素前后顺序一致即可;
2、上升:这里的“上升”是“严格上升”,类似于 [2, 3, 3, 6, 7] 这样的子序列是不符合要求的;
一个序列可能有多个最长上升子序列,题目中只要我们求这个最长的长度。

  • dp[i]含义:以下标为i的节点结尾的,最长的子序列长度是dp[i]
  • 递推公式:要求dp[i],但是此时不能由dp[i-1]来找,而是要遍历j:[0,i) 来找,max(max,dp[j]+1),max暂存所有的dp[i的上一个]的值,最后通过max找到一个最大的赋值给dp[i]。—— dp[i]=dp[j]+1 for(j[0,i))&&nums[i]>nums[j]
  • 初始值:dp[0]=1
  • for循环:先i找到所有dp[i], 内循环遍历j[0,i),找到每个dp[i]
class Solution {
    public int lengthOfLIS(int[] nums) {
        int len=nums.length;
        if(len<2){
            return len;
        }
        int[] dp=new int[len];
        dp[0]=1;
        int max=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[j]+1,dp[i]);//对所有的dp[j]+1进行比较
                }
            }
            max=Math.max(max,dp[i]);
        }
        return max;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值