时间复杂度为O(nlogn)的LIS算法】的更多相关文章

时间复杂度为 n*logn的LIS算法是用一个stack维护一个最长递增子序列 如果存在 x < y 且  a[x] > a[y],那么我们可以用a[y]去替换a[x] 因为a[y]比较小,具有更大的潜力,使得后面的元素和它成为更长的递增序列 如例子: a[] = {1,4,8,3,6}; 我们用一个stack st保存当前的最长递增子序列,top = 0; 很明显,初始化时st[top] = 1; 之后随着i循环变量的递增,如果 a[i] > st[top] , 那么 st[++top…
时间复杂度为O(nlogn)的排序算法(归并排序.快速排序),比时间复杂度O(n²)的排序算法更适合大规模数据排序. 归并排序 归并排序的核心思想 采用"分治思想",将要排序的数组从中间分成前后两个部分,然后对前后两个部分分别进行排序,再将排序好的两部分合并在一起,这样数组就有序了. 分治是一种解决问题的思想,递归是一种编程技巧,使用递归的技巧就是,先找到递归公式和终止条件,然后将递归公式翻译成递归代码. 归并排序的递推公式和终止条件: //递归公式 merge_sort(p...r)…
本文包括 1.快速排序 2.归并排序 3.堆排序 1.快速排序 快速排序的基本思想是:采取分而治之的思想,把大的拆分为小的,每一趟排序,把比选定值小的数字放在它的左边,比它大的值放在右边:重复以上步骤,直到每个区间只有一个数.此时数组已经排序完成. 快速排序最重要的是partition函数功能的实现,也就是将比选定基数小的值放在他的左边,比选定基数大的值放在它的右边的功能函数. 熟悉快速排序的人也许都会有自己的partition函数的写法.此处,提供两种不同的partition函数写法. 例1:…
LIS(Longest Increasing Subsequence)是一类典型的动态规划类问题,简化描述如下: 给定$N(n) = \{1,2...,n\}$的一个排列$P(n)$,求$P(n)$中最长上升子列的长度. 譬如令$n = 6$, $N(6) = \{1,2,3,4,5,6\}$,$P(n) = \{1,4,2,5,3,6\}$. 容易发现$LIS(P(n)) = \{1,2,3,6\} or \{1,4,5,6\}...$. 起初我们拿到问题的思路是这样的,我们试着先分析序列的前…
LIS算法经典汇总 假设存在一个序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出来它的LIS长度为5.下面一步一步试着找出它.我们定义一个序列B,然后令 i = 1 to 9 逐个考察这个序列.此外,我们用一个变量Len来记录现在最长算到多少了 首先,把d[1]有序地放到B里,令B[1] = 2,就是说当只有1一个数字2的时候,长度为1的LIS的最小末尾是2.这时Len=1 然后,把d[2]有序地放到B里,令B[1] = 1,就是说长度为1的LIS的最小末尾是1,d[1]=2…
时间复杂度O(nlogn)级排序算法 五.希尔排序 首批将时间复杂度降到 O(n^2) 以下的算法之一.虽然原始的希尔排序最坏时间复杂度仍然是O(n^2),但经过优化的希尔排序可以达到 O(n^{1.3})甚至 O(n^{7/6}). 略为遗憾的是,所谓「一将功成万骨枯」,希尔排序和冒泡.选择.插入等排序算法一样,逐渐被快速排序所淘汰,但作为承上启下的算法,不可否认的是,希尔排序身上始终闪耀着算法之美. 希尔排序本质上是对插入排序的一种优化,它利用了插入排序的简单,又克服了插入排序每次只交换相邻…
假设有序列:2,1,3,5,求一个最长上升子序列就是2,3,5或者1,3,5,长度都为3. LIS算法的思想是: 设存在序列a. ① 如果只有一个元素,那么最长上升子序列的长度为1: ② 如果有两个元素,那么如果a[1]>a[0],则最长上升子序列的长度为2,a[1]为该最长上升子序列的最后一个元素;若a[1]<a[0],则最长上升子序列的长度为1,a[0]和a[1]均为  其最长上升子序列的最后一个元素. ③ 如果由三个元素,那么如果a[2]>a[0],a[2]>a[1],则a[…
最大子序列和问题--时间复杂度O(NlogN) package a; /* * 最大子序列和问题,时间复杂度O(NlogN) */ public class Sequence { private static int maxSumRec(int[] a,int left,int right ){ if(left==right) if(a[left]>0) return a[left]; else return 0; int center=(left+right)/2; int maxLeftSu…
LeetCode 42. Trapping Rain Water Python解法 解题思路: 本思路需找到最高点左右遍历,时间复杂度O(nlogn),以下为向左遍历的过程. 将每一个点的高度和索引存成一个元组 (val, idx) 找到最高的点(可能有多个,任取一个),记为 (now_val, now_idx). 向左找第一个val不大于now_val的点(left_val, left_idx). 以left_val作为水平面,用height[left_val+1, now_val-1]中每一…
问题描述: 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N.比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等.这些子序列中最长的长度是4,比如子序列(1, 3, 5…