1. 程式人生 > >面試題(十一)最長遞增子序列

面試題(十一)最長遞增子序列



給定一個長度為N的陣列,找出一個最長的單調自增子序列(不一定連續,但是順序不能亂)。例如:給定一個長度為6的陣列A{5, 6, 7, 1, 2, 8},則其最長的單調遞增子序列為{5,6,7,8},長度為4

這個演算法採用DP策略,核心是維護一個END陣列,其中END[i]代表以pArray[i]作為子陣列的最後一個數時,這個子陣列的最大長度,那麼END[i+1]要麼等於END[ j ]+1,要麼等於1,0=<j<=i-1, 當END[i]等於1時候,說明pArray[i]比前面的

pArray[0]到pArray[i-1]都小,與前面的子序列不能構成遞增序列。當END[i+1]等於END[ j ]+1的時候,說明pArray[i]>pArray[j], 從而與之構成遞增子序列,所對應的最長子序列長度也就是END[ j ]+1;

程式碼如下:

int LIS(int *pArray,int nSize)
{
	if (pArray==NULL)
	{
		return -1;
	}
	int *pLIS=new int[nSize];
	
	pLIS[0]=1;
	for (int i=1;i<nSize;i++)
	{	pLIS[i]=1;
		for (int j=0;j<i;j++)
		{	
			if (pArray[i]>pArray[j]&&pLIS[j]+1>pLIS[i])
				//這個判斷決定pLIS[i]會取最大的那個
			{
				pLIS[i]=pLIS[j]+1;
			}
		}
	}
	delete []pLIS;
}