zoukankan      html  css  js  c++  java
  • 算法

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

  • 相关阅读:
    boost库
    DISALLOW_COPY_AND_ASSIGN
    汇编语言入门
    gflags
    Segmentation Fault
    ubuntu16.04_cuda9.0_opencv3.4_cudnn_v7_caffe
    make: aarch64-himix100-linux-gcc: Command not found
    gtest
    glog
    [Go]go语言实战-go版本的supervisord编译安装与运行
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7039837.html
Copyright © 2011-2022 走看看