首页 > 其他分享 >动态规划04——300. 最长递增子序列

动态规划04——300. 最长递增子序列

时间:2023-04-13 23:26:04浏览次数:42  
标签:04 nums 300 递增 len int 序列 dp

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

方法一:O(n²)动态规划

class Solution {
    public int lengthOfLIS(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n];
        Arrays.fill(dp,1);
        int res = 1;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < i; ++j) {
         // 满足严格递增条件,更新dp数组 if (nums[i] > nums[j]) { dp[i] = Math.max(dp[i],dp[j]+1); } } res = Math.max(res,dp[i]); } return res; } }

方法二:O(nlogn)动态规划

class Solution {
    public int lengthOfLIS(int[] nums) {
        int len = 1, n = nums.length;
        int[] d = new int[n + 1];
        d[len] = nums[0];
        for (int i = 1; i < n; ++i) {
            if (nums[i] > d[len]) {
                d[++len] = nums[i];
            } else {
                // 如果找不到说明所有的数都比 nums[i] 大,此时要更新 d[1],所以这里将 pos 设为 0
                int l = 1, r = len, pos = 0; 
                while (l <= r) {
                    int mid = (l + r) >> 1;
                    if (d[mid] < nums[i]) {
                        pos = mid;
                        l = mid + 1;
                    } else {
                        r = mid - 1;
                    }
                }
                d[pos + 1] = nums[i];
            }
        }
        return len;
    }
}

 

标签:04,nums,300,递增,len,int,序列,dp
From: https://www.cnblogs.com/fulaien/p/17316912.html

相关文章

  • 2023.04.13 定时测试随笔 T1
    T1P1133教主的花园传送门:洛谷P1133这是一道DP的题,定义状态\(dp[i][j][k]\)表示前\(i\)棵树所能达到的最大价值,且第\(i\)棵树为第\(j\)种树,\(j=0\)高度是\(10\),\(j=1\)高度是\(20\),\(j=2\)高度为\(30\),如果\(k=0\)它的高度小于相邻两颗,\(k=1\)则......
  • HDU 1452 Happy 2004 (积性函数)
    题目地址:HDU1452性质1:如果gcd(a,b)=1则S(a*b)=S(a)*S(b)2004^X=4^X*3^X*167^XS(2004^X)=S(2^(2X))*S(3^X)*S(167^X)性质2:如果p是素数则S(p^X)=1+p+p^2+…+p^X=(p^(X+1)-1)/(p-1)因此:S(2004^X)=(2^(2X+1)-1)*(3^(X+1)-1)/2*(167^(X+1)-1)/166......
  • ORACLE还原恢复启动时数据库报ORA-00704, ORA-00604, ORA-00904
    Oracle数据库还原恢复后,执行alterdatabaseopenresetlogs时遇到下面错误。如下所示:SQL> alter database open resetlogs;alter database open resetlogs*ERROR at line 1:ORA-00603: ORACLE server session terminated by fatal errorORA-01092: ORACLE ins......
  • 总结20230413
    今天周四,一周内最轻松的一天。今天只有一节体育课,体育课第一轮的比赛已经打完,结果不是很理想,三胜三负,小组里面是第四名,但是还有第二轮比赛,所以重新燃起自信,迎接第二轮的胜利,第二轮是根据第一轮的结果来分配的,希望分配到B组,有机会能杀出重围,与A组对打。今天晚上敲了大概两小时的j......
  • 04 Viewing Transformation
    关键点ModelViewTransformationMatrix(1-3)OrthographicProjectionMatrix(4)PerspectiveProjectionMatrix(5-6)1.View/Camera/ModelViewTransformationMVP(modeltransformation->viewtransformation->projectiontransformation)Cameradefine......
  • JAVAWEB-项目搭建准备工作八步骤-2023-04-13
    第一步:生成一个javamavenweb项目第二步:配置TOMCAT第三步:测试项目是否可以跑起来第四步:导入maven各个jar包+增加build解决资源导出问题<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://ww......
  • 2023/04/12刷题
    C.MakeItGood链接C.MakeItGood这个题是说去掉前缀,我们可以发现如果一个数列可以分为一个连续的上升区域和一个连续的下降区域的话,该数列是好的,该题的思路就是从后向前找到符合该特征的最长的序列#include<iostream>#include<algorithm>#include<cstdio>#includ......
  • 随笔20230413
    突然很想找个根本不讲中文的国家生活个一年两年。远离世俗、所有人,只和自己的灵魂独处一会,仔细地问问自己,你、我究竟从何而来,又终将魂归何处。我有深厚的基础生物知识,我系统学习过大量的理工科知识,我理解万事万物都有其运行的规律我明白一切缘起都终将湮灭可是我还是固执的认......
  • ubuntu 16.04.7初始化脚本
    #!/bin/bash#在root用户下运行cp/etc/apt/sources.list/etc/apt/sources.list.baksed-i"s@http://.*archive.ubuntu.com@http://mirrors.tuna.tsinghua.edu.cn@g"/etc/apt/sources.listsed-i"s@http://.*security.ubuntu.com@http://mirrors.tuna.tsingh......
  • HDU 5045 Contest(费用流)
    题目地址:HDU5045终于在比赛中用网络流A了一道题。。。刷了那么多网络流,终于用到一次了。。虽然题目很简单,但是还是要纪念一下下。。。我这题的思路就是求m/n次费用流,每n个算作同一轮,对这同一轮的求最大费用流。建图就很简单了,最简单的二分图模型。代码如下:#include<iostre......