首页 > 其他分享 >【dp的二分优化】NO300 最长递增子序列

【dp的二分优化】NO300 最长递增子序列

时间:2023-04-30 11:44:44浏览次数:52  
标签:二分 nums 序列 num ans var NO300 dp

【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^2)

    public int lengthOfLIS(int[] nums) {
        var len = nums.length;
        var dp = new int[len];
        Arrays.fill(dp, 1);
        var ans = 1;
        for(var i = 1; i < len; i++) {
            for(var j = 0; j < i; j++) {
                if(nums[i] > nums[j]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                    ans = Math.max(ans, dp[i]);
                }
            }
        }
        return ans;
    }
二分优化,真想不到这种

​ dp[i]表示长度为i的严格递增子序列的尾部元素的最小值,这句话可能有点绕,举个栗子,对于nums=[10,9,2,5,3,7,101,18],每个元素都是长度为1的子序列,但是最小的只有一个2,依次类推,对应的dp为[2,3,7,18]。

  • 可以看到dp一定是一个递增序列,因为长度为i的最小尾部元素肯定大于长度为i-1的尾部元素,因此这里可以使用二分法来查找
  • 为什么使用尾部最小值?因为只要满足大于长度为i的最小尾部元素,那么递增长度就能是i+1

​ 因此思路是首先遍历数组,对于数组的每一个值在dp中查找它大于的尾部最小元素的下标,更新这个下标的值为num值,并且如果下标是最后一个,则增加子序列的长度,可能还是有点绕,举一下上面dp的列子可能就清楚了:

  • num = 10,dp=[10]
  • num = 9,dp=[9]
  • num = 2,dp=[2]
  • num = 5,dp=[2, 5]
  • num = 3,dp=[2, 3]
  • num = 7,dp=[2, 3, 7]
  • num = 101,dp=[2, 3, 7, 101]
  • num = 18,dp=[2, 3, 7, 18]
public int lengthOfLIS(int[] nums) {
        var len = nums.length;
        var dp = new int[len];
        var ans = 0;
        for(var num : nums) {
            var i = 0;
            var j = ans;
            while(i < j) {
                var mid = (i + j) / 2;
                // 如果大于中间值,应该插入到中间值的右边
                if(dp[mid] < num) {
                    i = mid + 1;
                // 小于等于的时候不能mid-1,只需要更新mid
                } else {
                    j = mid;
                }
            }
            dp[i] = num;
            if(ans == i) {
                ans++;
            }
        }
        return ans;
    }

标签:二分,nums,序列,num,ans,var,NO300,dp
From: https://www.cnblogs.com/tod4/p/17365076.html

相关文章

  • android中的像素单位dp、px、pt、s…
    pixels(设备独立像素).不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA推荐使用这个,不依赖像素。px:pixels(像素).不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。pt:point,是一个标准的长度单位,1pt=1/72英寸,用于......
  • 最短路+二分题目整理
    前往奥格瑞玛的道路题目链接\(\qquad\)题目要求最小化最大费用,显然是使用二分答案,二分答案首先应该看限制和目标,此处的限制是血量限制,而目标是费用目标。这种情况我们可以二分费用,然后在图上跑最短路判定血量是否满足。\(\qquad\)对于check函数,我们去判定是否存在一条道路使得......
  • 常见dp问题
    dp的引入动态规划(简称dp),是指把一个问题分解为若干个子问题,通过局部最优解得到全局最优的一种算法策略或者说一种思想方法.简单来讲,就是用一个数组表示我们要求的问题的答案,如果知道前一个问题的答案,就可以推出后一个问题的答案dp有以下几个常见的概念:状态:......
  • Python+UDP+Threading
    Python+UDP+Threading近期用pythonsocket使用TCP协议做了一个小型的数据收发服务器,后来由于在实际场景中使用时,出现网络不佳导致出现错误的情况,改成了使用UDP协议重做了一版,总体效果变好了。下面是通用代码,实际使用时在这基础上进行修改即可。#-*-coding:utf-8-*-import......
  • 计数dp
    CODEFESTIVAL2016Final\(n,m\)很小,可以设很暴力的状态发现我每次就是一条路径然后回到\(1\)所在的强连通分量,不关心我现在在哪个点,所以设\(f_{i,j,k}\)表示现在走了\(i\)步,\(1\)所在的强连通分量里面有\(j\)个点,现在走了\(k\)个点还没有回到强连通分量里面转移......
  • WordPress extended XML-RPC MetaWeblog API
    XML-RPCMetaWeblogAPI«WordPressCodexWordPress.orgWordPress.orgPluginsThemesPatternsLearnSupportDocumentationForumsNewsAboutGetInvolvedFivefortheFutureShowcaseMobileHostingOpenverseGetWordPressSearch......
  • Codeforces 1804H - Code Lock(状压 dp)
    对于一种排列方案,答案显然等于相邻字符在环上对应的劣弧长度之和。然后其实你可能会想到很多状压/折半搜索方法,包括但不限于枚举一半的信息然后折半搜后一半,但稍加思考会发现这些方案都避不开记录元素之间的相对顺序,而但凡涉及到这一点,复杂度都是阶乘起步。因此我们只能另辟蹊......
  • Codeforces 1799H - Tree Cutting(树形 dp)
    思考的时候一直卡在不会在低于\(O(n)\)的时间内储存一个连通块的\(siz\)有关的信息,看了洛谷题解之后才发现我真是个小丑。树形DP。对于一条我们需要操作的边\((i,fa_i)\),我们将其分为保留子树和删除子树两种类型,对于删除子树,我们在判定其是否合法时候改为判定删除的连通块......
  • wordpress插件:代码高亮显示并配置样式(SyntaxHighlighter Evolved 3.6.2 / wordpress
    一,安装插件:SyntaxHighlighterEvolved点击插件->安装插件->输入:SyntaxHighlighter进行搜索结果显示后,找到并进行安装,如图:安装第一个安装后的效果:二,安装插件后调整样式(行高):先找到样式文件路径,当前如下:/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/......
  • [Linux]raspbian安装xrdp(远程桌面)
    1.首先换源:输入以下命令sudosed-i"s@http://deb.debian.org@https://mirrors.163.com@g"/etc/apt/sources.list2.update是更新软件列表,upgrade是更新软件。这两个命令一般是一起使用的。3.需要在Debian系统中安装xrdp,xrdpisadaemonthatsupportsMicrosoft'sRemoteD......