首页 > 编程语言 >【算法】关于最长递增子序列(LIS)二分+贪心解法

【算法】关于最长递增子序列(LIS)二分+贪心解法

时间:2024-02-26 23:33:25浏览次数:30  
标签:二分 复杂度 数组 LIS 长度 解法 贪心

前言

我们都知道,解决 LIS 的常规解法为 DP,时间复杂度为 O(n^2),但是在一些条件苛刻的问题中,通常 DP 的解法会超时。那么,是否存在一种时间复杂度更优秀的解法呢?答案是肯定的,有一种二分加贪心的解法可以将时间复杂度降低为 O(nlogn)。

详解

如果我们现在要求下面这一组数据的 LIS:

我们需要定义一个数组 g[i] 表示长度为 i 的 LIS 的末尾元素的最小值。接下来,我们依次把 nums[i] 有序地放进 g[i] 里。采用的策略是:

  • 如果 nums[i] 比 g[i-1] 大,放进到 g[i] 中;
  • 反之,则在 g[] 数组找到第一个比 nums[i] 大的位置替换掉。

过程如下:

此时, g[] 数组填充到第 len 位,LIS 的长度便是 len。不过需要注意的是,此时的 g[] 数组内的值,并不是正确的 LIS。如何理解上面的操作呢? g[] 长度的突破取决于最后一位数的大小,我们在更新 g[] 数组的时候,贪心的更新了各个长度为 i 的 LIS 的末尾元素的最小值,因此,当遍历完序列时,g[] 数组开辟的长度便是最长递增子序列的长度,这点需要自己好好体会一下。

标签:二分,复杂度,数组,LIS,长度,解法,贪心
From: https://www.cnblogs.com/zc-study-xcu/p/18035845

相关文章

  • LeetCode二分查找 swift 面试
     funcbinarySearch(_array:[Int],_target:Int)->Int?{varleft=0varright=array.count-1whileleft<=right{letmid=(left+right)/2ifarray[mid]==target{returnmid......
  • 洛谷题单指南-贪心-P4447 [AHOI2018初中组] 分组
    原题链接:https://www.luogu.com.cn/problem/P4447题意解读:将一个有序的数列,按不重复连续数分成一组,可分成若干组,使得人数最少的组在各种分组方式之中是最大的。解题思路:观察样例说明,有6个测试点的ai​互不相同,因此直接将数据排序,然后连续数分成一组,计算每组数量最少的,即为答案,6......
  • 704. 二分查找C
    现在开始刷代码随想录里的题了。intsearch(int*nums,intnumsSize,inttarget){inthead=0,tail=numsSize-1;while(head<=tail){intmid=(head+tail)/2;if(nums[mid]<target){head=mid+1;}elseif(nums[mid]>target){......
  • #分块,二分#洛谷 5356 [Ynoi2017] 由乃打扑克
    题目支持区间加和区间查询第\(k\)小分析分块之后给每个整块排序,这样修改的时候整块打标记,散块直接分开把需要加的部分暴力加之后归并,就是\(O(\sqrt{n})\)的查询的话,如果只有散块直接归并出结果,否则二分答案,加上小块合并成的整块,相当于是整体二分,就是\(O(\sqrt{n}\log{a_......
  • 通过多个字段作为唯一标识对List对象去重
    1、背景List对象定义形式和现有的值如下所示。List<Test>testList=newArrayList<>();[{"ISDEL":"","ATNAM":"Z008_80_PC_4270Y153","AEDTM":"20230808","MATNR":"80.PC......
  • redis自学(5)QuickList
    问题1:ZipList虽然节省内存,但申请内存必须是连续空间,如果内存占用较多,申请内存效率很低。怎么办?为了缓解这个问题,我们必须限制ZipList的长度和entry大小。问题2:但是我们要存储大量数据,超出了ZipList最佳的上限怎么办?我们可以创建多个ZipList来分片存储数据。问题3:数据拆分后比......
  • redis-深入分析redis之listpack,取代ziplist?
    ziplist的不足主要在于当ziplist中元素个数过多,它的查找效率就会降低。而且如果在ziplist里新增或修改数据,ziplist占用的内存空间还需要重新分配;更糟糕的是,ziplist新增某个元素或修改某个元素时,可能会导致后续元素的prevlen占用空间都发生变化,从而引起连锁更新问题,导致......
  • 洛谷题单指南-贪心-P4995 跳跳!
    原题链接:https://www.luogu.com.cn/problem/P4995题意解读:消耗最大的体力跳完所有石头,贪心选择问题。解题思路:贪心策略:每次保证有最大的高度差即可,第一次跳到最大高度然后跳到最小高度,再跳到剩下的最大高度,再跳第二小高度,以此类推,直到跳完所有石头。100分代码:#include<bi......
  • Toyota Programming Contest 2024#2(AtCoder Beginner Contest 341)D - Only one of two
    目录链接题面题意题解代码总结链接D-Onlyoneoftwo题面题意求第\(k\)个只能被\(N\)或\(M\)整除的数题解\([1,x]\)中的能被\(n\)整除的数有\(\lfloor\frac{x}{n}\rfloor\)个\([1,x]\)中的能被\(m\)整除的数有\(\lfloor\frac{x}{m}\rfloor\)个\([1,x]\)中的能被\(n\)......
  • 洛谷题单指南-贪心-P1094 [NOIP2007 普及组] 纪念品分组
    原题链接:https://www.luogu.com.cn/problem/P1094题意解读:贪心选择解题思路:贪心策略:将纪念品按价格由小到大排序,优先选择价格大的一直到超过分组价格上限,再选择价格小的直到超过价格上限,此为一组重复以上过程,直到所有数据都遍历到,采用一头一尾双指针即可。证明:如果最大价格......