• 算法


    //****************************************************************************************************
    //
    //  求一个数组的最长递减子序列 - 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
    */
    

  • 相关阅读:
    解决Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile
    eclipse下解决明明有jar包,却找不到的问题
    Ngnix负载均衡安装及配置
    Redis入门教程(二)
    js监听组合按键
    js清空数组的方法
    js判断浏览器是否支持webGL
    Maven入门教程(一)
    杂记
    第一天 Requests库入门
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7039837.html
Copyright © 2020-2023  润新知