当前位置: 首页 > news >正文

LeetCode 300. 最长递增子序列

🌈🌈😄😄

欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 300. 最长递增子序列,做好准备了么,那么开始吧。

🌲🌲🐴🐴

一、题目名称

LeetCode 300. 最长递增子序列

二、题目要求

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

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

三、相应举例

示例 1:

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

输入:nums = [0,1,0,3,2,3]
输出:4
示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1

四、限制要求

  • 1 <= nums.length <= 2500
  • -104 <= nums[i] <= 104

五、解决办法

动态规划

创建一个数组dp,初始化为1。使用两重循环,第一重循环遍历nums数组,当作右指针,第二重循环遍历之前的数,当作左指针,判断当前数是否大于之前的数。如果是,更新dp[j]的值为dp[i]+1。

这里要注意dp数组中当前所求值要取前面遍历过的最大值,比如

int nums[]={0,1,0,3,2,3};

在dp索引到达3时,前方要取0->1->3而不是单纯的更新dp[j]的值为dp[i]+1,所以代码为 

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

更新maxans的值为dp[j]的最大值。最后返回maxans。

六、代码实现

class Solution {
     public static int lengthOfLIS(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        int[] dp = new int[nums.length];
        dp[0] = 1;
        int maxans = 1;
        for (int j = 1; j < nums.length; j++) {
            dp[j] = 1;
            for (int i = 0; i < j; i++) {
                if (nums[i] < nums[j]) {
                    dp[j] =  Math.max(dp[i] + 1,dp[j]);
                }
            }
            maxans = Math.max(maxans, dp[j]);
        }
        return maxans;


    }
}

复杂度分析

时间复杂度:O(n^2) ,其中 n 为数组 nums 的长度。动态规划的状态数为 n,计算状态 dp[i] 时,需要O(n) 的时间遍历 dp[0…i−1] 的所有状态,所以总时间复杂度为 O(n 2)。

空间复杂度:O(n),需要额外使用长度为 n 的 dp 数组。

 

 

相关文章:

  • 做招聘网站如何宣传/宁德seo优化
  • 自己做的网站地址手机怎么打不开/全媒体运营师报名入口
  • 大连做网站比较好的公司/百度免费发布信息网站
  • 多个网站优化怎么做/市场推广是做什么的
  • 为什么要建设企业网站/电商网站公司
  • 推荐常州网站建设/360公司官网首页
  • 《和声学教程》学习笔记(二):终止和终止四六和弦
  • 软件测试最常用的 SQL 命令 | 通过实例掌握基本查询、条件查询、聚合查询
  • 秒懂 Java BlockingQueue
  • 数据结构初阶:排序
  • Promise(基础)
  • 冰蝎V4.0流量分析到攻防检测
  • 【vue系列-06】vue的组件化编程
  • 招标采购中,如何编写有效的RFI(信息邀请书)?
  • 【web】微信小程序笔记小结(模板与配置)
  • shell 脚本中 的> /dev/null 2>1
  • python-while循环
  • Dopamine-PEG-N3,多巴胺聚乙二醇叠氮 科研试剂用于点击化学