LeetCode——300. 最长递增子序列

最长递增子序列

题目

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

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

思路

利用一个简单的动态规划来解答就可以了。开一个dp数组,dp[i]表示以当前数字结尾的最长递增子序列,然后每次都是初始值为1,因为最少就有本身的一个数字。然后从前面往后遍历,一旦出现nums[j]<nums[i],表示当前dp[i]的状态可以由dp[j]+1转换而来。假设要求不严格递增,条件就可以为nums[j]<=nums[i]。需要注意一点是,并不是最后的dp[i]就是一个最大值,我们的dp[i]表示的意思是最后的数字一定要取到,当最后的数字很小时,dp[i]不一定能取得结果的最大值,所以我们需要每次都进行一次比较。

代码

//最长递增自序列,dp[i]为考虑前i个元素,并且nums[i]必须选取的最大子序列
class Solution {
    public int lengthOfLIS(int[] nums) {
        if (nums.length==0)
            return 0;
        int length=nums.length;
        int dp[]=new int[length];
        int ans=1;
        dp[0]=1;
        for (int i=1;i<length;++i)
        {
            dp[i]=1;//至少有一个,即本身
            for (int j=0;j<i;++j)
            {
                if (nums[i]>nums[j]) //可以由比它小的数这个状态转移过来,只要该数比它小就可以加1进行比较
                    dp[i]=Math.max(dp[i],dp[j]+1);
            }
            ans=Math.max(ans,dp[i]); //每次都要取出dp[i]中最大的那一个作为结果
        }
        return ans;
    }
}

结果

AC了,
在这里插入图片描述
也算是学到了动态规划的另外一个子问题,还算有点收获,不错不错!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值