1. 程式人生 > >時間複雜度為O(nlogn)的最長單調遞增子序列

時間複雜度為O(nlogn)的最長單調遞增子序列

寫一記,其中利用二分查詢法,具體分析見程式設計之美。

#include <iostream>
using namespace std;
#define N	20

int binarySearch(int src[], int des, int low, int high)
{
	int i = low, j = high;
	while (low < high)
	{
		int mid = (low + high) / 2;
		if (des > src[mid])
		{
			low = mid+1;
		}
		else if (des < src[mid])
		{	
			high = mid;
		}
		else
			return mid;
	}
	return low;
}

int LIS_Length(int X[], int len)
{
	int LIS[N];
	LIS[0] = INT_MIN;
	for (int i = 1; i < N; i++)
	{
		LIS[i] = INT_MAX;
	}

	for (int i = 0; i < len; i++)
	{
		int loc;
		loc = binarySearch(LIS, X[i], 0, len);
		LIS[loc] = X[i];
	}

	int count = 0;
	for (int i = 1; i <= len; i++)
	{
		if (LIS[i] < INT_MAX)
		{
			cout<<LIS[i]<<" ";
			count++;
		}
	}
	cout<<endl;
	return count;
}

int main()
{
	int X[] = {3, 2, 5, 6, 1, 4, 7};
	int len = 7;
	cout<<LIS_Length(X, len);
}

相關推薦

時間複雜O(nlogn)的單調遞增序列

寫一記,其中利用二分查詢法,具體分析見程式設計之美。 #include <iostream> using namespace std; #define N 20 int binarySearch(int src[], int des, int low, int

Java-時間複雜O(nlogn)的排序演算法(快速排序, 歸併排序, 堆排序, 希爾排序)

/** 包含多種靜態排序方法 * Created by Andre on 2016/6/27. */ public class Sorter { /** * 快速排序 * 遞迴形式 * 第一個記錄為樞軸 * 不穩定

排序(二)時間複雜O(nlogn)的排序演算法

時間複雜度為O(nlogn)的排序演算法(歸併排序、快速排序),比時間複雜度O(n²)的排序演算法更適合大規模資料排序。 ## 歸併排序 ### 歸併排序的核心思想 採用“分治思想”,將要排序的陣列從中間分成前後兩個部分,然後對前後兩個部分分別進行排序,再將排序好的兩部分合並在一起,這樣陣列就有序了。

單調遞增序列O(nlogn)

#include "iostream" #include "fstream" using namespace std; /* b[k]表示長度為i的子序列c[i]中,長度為k的最長單調遞增子序列的最小

單調遞增序列O(n^2))

#include "iostream" #include "fstream" using namespace std; /* b[i]表示長度為i的子序列c[i]中,由若干元素組成的最長單調遞增子序列

單調遞增序列( O(nlgn) )

          最長單調遞增子序列 設A是n個不同正整數構成的序列,求A的一個最長遞增子序列。例如序列為1,5,3,8,10,6,4,9;它的最長遞增子序列為1,5,8,10;1,5,8,9;...。 這是一道很典型的動態規劃題目。設fi表示結尾元素為原序列中第i個元素

[dp]單調遞增序列

bsp 存在 ont for printf iss 需要 hellip 註意 https://www.51nod.com/tutorial/course.html#!courseId=12 解題關鍵: 如果將子序列按照長度由短到長排列,將他們的最大元素放在一起,形成新序

[C++] 動態規劃之矩陣連乘、公共序列大子段和、單調遞增序列

每次 種子 () return 避免 amp 可能 text com 一、動態規劃的基本思想   動態規劃算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應於一個值,我們希望找到具有最優值的解。   將待求解問題分解成若幹個子問題,先求

NYOJ17 單調遞增序列 線性dp

tar 最長 using print code \n clu sca can 題目鏈接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=17 分析: i=1 dp[i]=1 i!=1 dp[i]=max(dp[j]+

動態規劃——單調遞增序列

題目描述 用動態規劃設計一個演算法,要求找出由n個整陣列成的序列的最長單調遞增子序列的個數(假設所有的元素都不相同)。 輸入 第一行輸入一個整數,表示有n個整數。 第二行輸入n個整數。 輸出 第三行輸出最長單調遞增子序列的個數。 樣例輸入 6 1 3 2 5

動態規劃之單調遞增序列(C++原始碼)

動態規劃之最長單調遞增子序列 問題: L={a1,a2,a3,…,an}既L是由n個不同的實陣列成的序列,求L的最長單調遞增子序列(下標可不連續)。 分析: 設輔助陣列b,b[i]表示以a[i]為結尾的最長遞增子序列的長度,最長遞增子序列的長度,就是陣列b的最大

單調遞增序列的三種解法

問題描述:找出由n個數組成的序列的最長單調遞增子序列 解法一:轉化成LCS問題求解,時間複雜度為O(n*n). 思路:原序列為A,把A按升序排序得到序列B,求出A,B序列的最長公共子序列,即為A的最長

nyoj 17 資料結構 單調遞增序列

單調遞增最長子序列 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 描述求一個字串的最長遞增子序列的長度 如:dabdbf最長遞增子序列就是abdf,長度為4

單調遞增序列--幾種方法

設給定的序列為num[n] 1.O(n^2)的求法 動態規劃的方法 狀態定義:設dp[i] 表示以num[i]結尾的最長單調遞增子序列的長度 狀態方程:dp[i] = max(dp[k] + 1

Manacher演算法:求解迴文字串,時間複雜O(N)

迴文串定義:“迴文串”是一個正讀和反讀都一樣的字串,比如“level”或者“noon”等等就是迴文串。迴文子串,顧名思義,即字串中滿足迴文性質的子串。 經常有一些題目圍繞回文子串進行討論,比如POJ3974最長迴文,求最長迴文子串的長度。樸素演算法是依次以每一個字元為中心

時間複雜O(m*n)公共

什麼叫最長公共子串,就是兩個字串當中最長的連續的公共子串,注意連續;而子序列可以不連續,順序一樣即可,不要混淆。 對於兩個子串,我們先找出短字串L中(長的也可以)每個字元在長字串H中的位置,這樣我們就構建出一個二維表: L:deasdfe1ra H:unnasdsdfew3

遞增序列 時間複雜O(NlogN

假設存在一個序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出來它的LIS長度為5。 下面一步一步試著找出它。 我們定義一個序列B,然後令 i = 1 to 9 逐個考察這個序列。 此外,我們用一個變數Len來記錄現在最長算到多少了 首先,把d[1]有序地放

棧表中獲取小值,時間複雜O(1)

       近期複習資料結構,看到網上有一道演算法題,該題目曾經是google的一道面試題,國內的網際網路公司也紛紛效仿。我也順便複習之。        題目內容為:對現在的stack(棧)資料結構進行改進,加一個

實現一個棧,要求實現Push(出棧)、Pop(入棧)、Min(返回小值)的時間複雜O(1)

這道題考查棧的知識點,要求實現一個棧,在對這個棧進行入棧和出棧以及返回最小棧元素時要求時間複雜度為O(1)。 方法一: 用兩個棧,一個正常出入棧,另一個存最小棧,入棧的時候第一個站正常入,最小棧如果為空或者要入的data比最小棧的棧頂元素小的時候才給最小棧入棧。

【資料結構】實現一個棧要求實現Push(出棧)Pop(入棧)Min(返回小值)的時間 複雜O(1)

文章目錄 思路 MinStack.h MinStack.c Test.c 棧的基本實現: https://blog.csdn.net/weixin_41892460/article/details/8297385