7月25日:最长上升子序列

题目如下:

    经过一个多月的leetcode刷题,虽然很多题还是刷不明白,但是有些套路还是能够想到,比如这道题。题目要求求最长上升子序列。我一开始将题意看错了,题目要求的是最长上升子序列,我理解成立求最长连续上升子序列,还用到了双指针法,可是一直通过不了,后来仔细将我的输出结果和目标结果进行对比,才发现,原来题目所说的子序列并不要求序列得连续。

    然后只好想其他方法了,看到最长让我想到了动态规划,动态规划的难点在于找到状态转移方程,可能还是我对动态规划理解的不到位吧,一时间还是想不到。然后就看了题解

这是力扣上的官方题解,看完这个官方题解我还是不太理解,我不太理解主要还是把关注点完全放在了dp状态转移数组上了,我只是单独的看状态转移数组了,而这个题还得联系原始数组来看,因为题目要求是上升子序列,所以进行状态转移之前得先遍历0到当前i,将他们作比较,如果当前num[i]大于遍历过程中的数,则取dp[i]=max(dp[j])+1。

终于还是理解了,那么就动手些咯:

public int lengthOfLIS(int[] nums) {

        if(nums.length==0) return 0;

        int[] dp = new int[nums.length];

        dp[0] = 1;

        int max = 1;

        for(int i=1;i<nums.length;i++){

            int maxval =0;

            for(int j=0;j<i;j++){

                if(nums[i]>nums[j]){

                    if(maxval<dp[j]){

                        maxval = dp[j];

                    }

                }

                 dp[i]=maxval+1;

                 if(max<dp[i])

                    max = dp[i];

            }

        }

        return max;

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值