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
    */
    

  • 相关阅读:
    什么是枚举?有什么作用?有什么好处?
    java获取某个范围内的一个随机数
    java中普通代码块,构造代码块,静态代码块的区别及代码示例
    Oracle数据库迁移
    linux下修改文件权限
    <%@ include file="">和<jsp:include file="">区别
    JAVA常见异常解析
    jdk环境变量配置
    jstl中fmt标签详解
    jsp脚本元素
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7039837.html
Copyright © 2011-2022 走看看