面向小白的力扣300. 最长递增子序列-动态规划

110 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

今天,我们继续搞算法。

题目描述

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

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

image.png

解题过程

啥度不会先写解

image.png

然后我们看入参,入参是一个数组,那数组里面有什么呢?我们看示例:

输入: nums = [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长递增子序列是 [2,3,7,101],因此长度为 4 。

给了你一个数组,返回它的最长递增子序列,子序列我们知道,就是不连续的选几个数,比如这个[10,9]就是一个子序列,还得递增那就是[9,10]。那这个问题就是这个数选还是不选的问题,因为我们要的是递增的序列,所以我们不会选所有的数,假设我们选了第i个数,当然是满足递增的,不满足递增的我们不会选,然后我们需要遍历i之前的数,把他们选的数的长度还得加上i本身再和选的i本身进行比较,谁大就要谁。然后我们遍历所有函数,取最大的一个就是我们要返回的答案。

class Solution {
      public int lengthOfLIS(int[] nums) {
        int m = nums.length;
        int f[] = new int[m];

        for(int i=0;i<m;i++) f[i] = 1;

        for(int i=0;i<m;i++){
            for(int j=0;j<i;j++){
                if(nums[i]>nums[j]){
                    f[i] = Math.max(f[i],f[j]+1);
                }
            }
        }
        
        int ans =0;
        for(int i = 0;i<m;i++){
            ans=Math.max(ans,f[i]);
        }
        return ans;
    }
}