zoukankan      html  css  js  c++  java
  • 编程之美2.16 最长递增子序列

          这道题目要求返回一个数字。这个数字代表一个数组中最长的递增子序列,当然。不要求这个序列是连续的。比方,有这样一个数组:{1, 3,5。7, 2, 9},那么这个数组的最长递增子序列就是5。即1,  3,  5,  7,9

          解决这道题目的思想就是:后面的数字仅仅要是大于前面递增子序列的最大值,那么,它就一定大于前面全部的序列,既然须要知道前面保存的序列,那么,我们这里就须要一个辅助数组。数组中存储的就是“最小的连续递增子数组”。我们操作这个数组时。须要遵循两个规律:

          假设这个辅助数组为空,那么直接把原数组的数字放入当中

          1.假设原数组中的数字大于辅助数组的最大数字(即最后一个数字)。那么。直接把原数组中的数放入当中就能够了,并把递增序列值加 1 

          2.假设原数组中的数字小于等于辅助数组的最大数字,那么。因为我们须要的是最小的连续递增子数组,所以,须要替换辅助数组中的值。这里,我们能够利用二分查找的办法(因为辅助数组是有序的),找到恰好比当前数字大的那个数字。替换掉即可了

         最后。返回辅助数组的长度就能够了:

         函数声明:

    /*2.16 最长递增子序列*/
    int DutBinFindForLRS(int*, int, int);
    int DutLRS(int*, int);

          源码:

    /*二分查找*/
    int DutBinFindForLRS(int* A, int size, int v)
    {
    	if (!A || size <= 0)
    		return -1;
    
    	int low = 0;
    	int high = size - 1;
    
    	while (low <= high)
    	{
    		int mid = low + (high - low) / 2;
    
    		if (v >= A[mid])
    			low = mid + 1;
    		else
    			high = mid - 1;
    	}
    
    	return low;
    }
    
    int DutLRS(int* A, int size)
    {
    	if (!A || size <= 0)
    		return 0;
    
    	int len = 1;
    	int* tmp = new int[size];
    	tmp[0] = A[0];
    
    	for (int i = 1; i < size; ++i)
    	{
    		if (A[i] > tmp[len - 1])
    			tmp[len++] = A[i];
    		else
    		{
    			int pos = DutBinFindForLRS(tmp, len, A[i]);
    
    			tmp[pos] = A[i];
    		}
    	}
    
    	delete[] tmp;
    	tmp = NULL;
    
    	return len;
    }


  • 相关阅读:
    sql server 获取存储过程,表值,标量函数的参数
    拼接枚举字符串
    存储过程的输出接受强类
    映射对象
    C# abstract,virtual 修饰符
    SqlSugar之SqlQueryDynamic返回值处理
    sql server 中数据库数据导入到另一个库中
    sql server 自增长显式添加值
    sql得到表中的列信息
    程序中MMap集合数据重复导致程序慢的情况
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6726923.html
Copyright © 2011-2022 走看看