首页 > 代码库 > 算法 - 求一个数组的最长递减子序列(C++)

算法 - 求一个数组的最长递减子序列(C++)

//****************************************************************************************************
//
//  求一个数组的最长递减子序列 - C++ - by Chimomo
//
//  题目: 求一个数组的最长递减子序列,比方{8, 14, 6, 2, 8, 14, 3, 2, 7, 4, 7, 2, 8, 101, 23, 6, 1, 2, 1, 1}的最长递减子序列为{14。8,3。2,1}。
//
//  Answer: Scan from left to right, maintain a decreasing sequence. For each number, binary search in the decreasing sequence to see whether it can be substituted.
//
//****************************************************************************************************

#include <iostream>
#include <cassert>
#include <stack>

using namespace std ;

int BinarySearch(int *A, int nTarget, int nLen);

// Find the longest decreasing sequence in array A of length nLen.
void FindLongestDecreasingSequence(int *A, int nLen)
{
	int *index = new int[nLen];
	int *LDS = new int[nLen];
	index[0] = A[0];
	LDS[0] = 1;
	int indexLen = 1;

	for (int i = 1; i < nLen; i++)
	{
		int pos = BinarySearch(index, A[i], indexLen);
		index[pos] = A[i];
		LDS[i] = pos + 1;
		if(pos >= indexLen)
		{
			indexLen++;
		}
	}

	int ResultLen = indexLen;

	for (int i = nLen; i >= 0; i--)
	{
		if(LDS[i] == ResultLen)
		{	
			index[ResultLen - 1] = A[i];
			ResultLen--;
		}		
	}

	for (int i = 0; i < indexLen; i++)
	{
		cout << index[i] << " ";
	}

	delete [] index;
}

// Binary search nTarget in array A of length nLen.
int BinarySearch(int *A, int nTarget, int nLen)
{
	assert(A != NULL && nLen > 0);
	int start = 0;
	int end = nLen - 1;

	while (start <= end)
	{
		int mid = (start + end) / 2;

		if(nTarget > A[mid])
		{
			end=mid-1;
		}
		else if(nTarget<A[mid])
		{
			start=mid+1;
		}
		else
		{
			return mid;
		}
	}

	return start;
}

int main()
{
	int A[] = {8, 14, 6, 2, 8, 14, 3, 2, 7, 4, 7, 2, 8, 101, 23, 6, 1, 2, 1, 1};
	int nLen = sizeof(A) / sizeof(int);
	FindLongestDecreasingSequence(A, nLen);
	return 0;
}

// Output:
/*
14 8 7 6 2 1
*/

算法 - 求一个数组的最长递减子序列(C++)