最长非下降子序列(O(nlogn))(offer收割)
题目
如题
思路
核心思想是,维护一个数组ends,它记录了长度为k的子序列的末尾元素的最小值。听起来很抽象,我们不妨手动演示一遍整个过程。
假设数组a={2,9,4,27,29,15,7},令length表示当前找到的最长非下降子序列的长度。初始时length=1,ends[1]=2。
i=1,length=2,ends[2]=9;
i=2,length=2,ends[2]=4,原因是4比9更容易和后面的数构成非下降子序列;
i=3,length=3,ends[3]=27;
i=4,length=4,ends[4]=29;
i=5,length=4,15能和ends[2]=4连接起来,并且它比ends[3]=27更容易和后面的数构成非下降子序列,因此ends[3]=15;
i=6,length=4,end[3]=7。
可以看到,整个算法就是找到ends中第一个大于当前数的位置。假设当前数为a[i],找到的位置为t,说明ends[t-1]<=a[i],那么a[i]可以和ends[t-1]连接起来,构成长度为i的子序列,同时ends[t]>a[i],说明a[i]要比ends[t]更容易和后面的数构成子序列,因此进行替换。可以说,算法的思想是贪心加二分。
代码
package com.iqiyi;public class Test {public static void main(String[] args){int[] array=new int[]{2,9,4,27,29,15,7};int[] ends=new int[array.length+1];ends[1]=array[0];int length=1;for(int i=1;i<array.length;i++){int low=1;int high=length;while(low<high){int mid=(low+high)/2;if(ends[mid]<=array[i])low=mid+1;elsehigh=mid;}if(ends[low]>array[i])ends[low]=array[i];else{length++;ends[length]=array[i];}}System.out.println(length);}
}
复制代码
转载于:https://juejin.im/post/5c39b1d26fb9a049a81f8ced
最长非下降子序列(O(nlogn))(offer收割)相关推荐
- 最长不下降子序列O(NlogN) 输出序列
文章目录 不输出序列的思路 输出序列 代码 例题:导弹拦截 不输出序列的思路 我们对于O(n2)O(n^2)O(n2)的最长不下降子序列十分熟悉了. #include <bits/stdc++. ...
- [Usaco2008 Feb]Eating Together麻烦的聚餐[最长不下降子序列]
Description 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的 ...
- 最长不下降子序列的O(n^2)算法和O(nlogn)算法
转帖 最长不下降子序列的O(n^2)算法和O(nlogn)算法 最长不下降子序列(LIS:Longest Increasing Subsequence) //用句通俗的话说,我讲的很通俗易懂~~ 问题 ...
- 求序列最长不下降子序列_最长不下降子序列nlogn算法详解
今天花了很长时间终于弄懂了这个算法--毕竟找一个好的讲解真的太难了,所以励志我要自己写一个好的讲解QAQ 这篇文章是在懂了这个问题n^2解决方案的基础上学习. 解决的问题:给定一个序列,求最长不下降子 ...
- 最长不下降子序列 (O(nlogn)算法)
分析: 定义状态dp[i]表示长度为i的最长不下降子序列最大的那个数. 每次进来一个数直接找到dp数组第一个大于于它的数dp[x],并把dp[x - 1]修改成 那个数.就可以了 AC代码: # in ...
- 最长不下降子序列(推广问题)
最长不下降子序列问题的定义:在一个序列中,找到一个最长的子序列,其中这个序列是非递减的 我们可以把这个非递减推广,其实非递减就是一种顺序,那么我们可以把定义推广到:给出一个顺序序列.目标序列中,在目标 ...
- 最长不下降子序列java代码_浅谈最长不下降子序列与最长上升子序列
唔,最长不下降子序列与最长上升子序列曾是困扰蒟蒻多时的一个问题,应该也有一些人分不清这2个的求法吧. 首先n^2算法肯定是都能分清的,因为不下降和上升的区别是连续的2个能不能相等,只需要在判断的时候判 ...
- CodeForces - 1437E Make It Increasing(确定首尾的最长不下降子序列)
题目链接:点击查看 题目大意:给出一个长度为 n 的序列,现在有 m 个位置被锁定,也就是无法进行操作,每次操作可以选择一个没有被锁定的位置,将其更改为任意数值,现在问最少进行多少次操作,可以使得整个 ...
- jzoj 3947. 【省常中JSOI模拟】收历史作业 最长不下降子序列
Description 小W 回到了教室,可怜的他要收历史作业,但是0901 班这群不负责任的组长把作业收得乱七八糟,散得每个座位上都有作业本,小W 只好挨个去收. 0901 班的教室可以看作是一个n ...
最新文章
- 函数式编程之-拒绝空引用异常(Option类型)
- uva10401Injured Queen Problem(递推)
- 1,2 多维运动公式
- 程序员常犯的五个非技术性错误
- 开博首发2017年1月13日开博大吉
- linux为什么开机后有多个内核,CentOS7开机界面出现多个内核选项
- 子类能不能继承父类的构造方法?
- Android官方开发文档Training系列课程中文版:后台服务之IntentService的使用
- YlmF WinXP SP3精简版安装显卡驱动技巧
- 如何打造139团队(不同层次人员的选择与培养,大型研发团队,大型敏捷开发团队)...
- void muse.each(object, function)
- input文本框不可编辑的方法
- 数据库性能优化的五种方案
- ACM公约数和公倍数
- 【游戏】Win 10 运行红色警戒2
- cpp设计并实现大整数
- Sass、Scss、Less和Stylus区别总结
- 逆向破解之易语言按钮事件特征码
- 惊呆了!我用 Python 可视化分析和预测了 2022 年 FIFA世界杯
- 【BZOJ1123】[POI2008]BLO【割顶】