题目

  如题

思路

  核心思想是,维护一个数组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收割)相关推荐

  1. 最长不下降子序列O(NlogN) 输出序列

    文章目录 不输出序列的思路 输出序列 代码 例题:导弹拦截 不输出序列的思路 我们对于O(n2)O(n^2)O(n2)的最长不下降子序列十分熟悉了. #include <bits/stdc++. ...

  2. [Usaco2008 Feb]Eating Together麻烦的聚餐[最长不下降子序列]

    Description 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的 ...

  3. 最长不下降子序列的O(n^2)算法和O(nlogn)算法

    转帖 最长不下降子序列的O(n^2)算法和O(nlogn)算法 最长不下降子序列(LIS:Longest Increasing Subsequence) //用句通俗的话说,我讲的很通俗易懂~~ 问题 ...

  4. 求序列最长不下降子序列_最长不下降子序列nlogn算法详解

    今天花了很长时间终于弄懂了这个算法--毕竟找一个好的讲解真的太难了,所以励志我要自己写一个好的讲解QAQ 这篇文章是在懂了这个问题n^2解决方案的基础上学习. 解决的问题:给定一个序列,求最长不下降子 ...

  5. 最长不下降子序列 (O(nlogn)算法)

    分析: 定义状态dp[i]表示长度为i的最长不下降子序列最大的那个数. 每次进来一个数直接找到dp数组第一个大于于它的数dp[x],并把dp[x - 1]修改成 那个数.就可以了 AC代码: # in ...

  6. 最长不下降子序列(推广问题)

    最长不下降子序列问题的定义:在一个序列中,找到一个最长的子序列,其中这个序列是非递减的 我们可以把这个非递减推广,其实非递减就是一种顺序,那么我们可以把定义推广到:给出一个顺序序列.目标序列中,在目标 ...

  7. 最长不下降子序列java代码_浅谈最长不下降子序列与最长上升子序列

    唔,最长不下降子序列与最长上升子序列曾是困扰蒟蒻多时的一个问题,应该也有一些人分不清这2个的求法吧. 首先n^2算法肯定是都能分清的,因为不下降和上升的区别是连续的2个能不能相等,只需要在判断的时候判 ...

  8. CodeForces - 1437E Make It Increasing(确定首尾的最长不下降子序列)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,现在有 m 个位置被锁定,也就是无法进行操作,每次操作可以选择一个没有被锁定的位置,将其更改为任意数值,现在问最少进行多少次操作,可以使得整个 ...

  9. jzoj 3947. 【省常中JSOI模拟】收历史作业 最长不下降子序列

    Description 小W 回到了教室,可怜的他要收历史作业,但是0901 班这群不负责任的组长把作业收得乱七八糟,散得每个座位上都有作业本,小W 只好挨个去收. 0901 班的教室可以看作是一个n ...

最新文章

  1. 函数式编程之-拒绝空引用异常(Option类型)
  2. uva10401Injured Queen Problem(递推)
  3. 1,2 多维运动公式
  4. 程序员常犯的五个非技术性错误
  5. 开博首发2017年1月13日开博大吉
  6. linux为什么开机后有多个内核,CentOS7开机界面出现多个内核选项
  7. 子类能不能继承父类的构造方法?
  8. Android官方开发文档Training系列课程中文版:后台服务之IntentService的使用
  9. YlmF WinXP SP3精简版安装显卡驱动技巧
  10. 如何打造139团队(不同层次人员的选择与培养,大型研发团队,大型敏捷开发团队)...
  11. void muse.each(object, function)
  12. input文本框不可编辑的方法
  13. 数据库性能优化的五种方案
  14. ACM公约数和公倍数
  15. 【游戏】Win 10 运行红色警戒2
  16. cpp设计并实现大整数
  17. Sass、Scss、Less和Stylus区别总结
  18. 逆向破解之易语言按钮事件特征码
  19. 惊呆了!我用 Python 可视化分析和预测了 2022 年 FIFA世界杯
  20. 【BZOJ1123】[POI2008]BLO【割顶】

热门文章

  1. java 解析http返回的xml_Java解析调用webservice服务的返回XML串详解
  2. (一)nodejs循序渐进-nodejs环境安装(基础篇)
  3. 算法(6)-leetcode-explore-learn-数据结构-数组字符串的双指针技巧
  4. 该工程中的宏被禁止_建筑劳务分包都能承担什么工程
  5. C++学习 高级编程
  6. 英语口语Week 15 Wednesday
  7. Java Stream MapReduce大数据开发模型
  8. 看脸色知体内各积毒 有效清洁内脏妙方
  9. 国内手机产业混乱:产业一窝蜂 企业捞快钱
  10. 公司管理项目管理中的技巧