• 求数组中最长递增子序列的长度


    求数组中最长递增子序列的长度

    个人信息:就读于燕大本科软件project专业 眼下大三;

    本人博客:google搜索“cqs_2012”就可以;

    个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献;

    编程语言:C++ ;

    编程坏境:Windows 7 专业版 x64;

    编程工具:vs2008;

    制图工具:office 2010 powerpoint;

    硬件信息:7G-3 笔记本;


    真言

    怒冲北京,为理想前行。

    题目

    求数组中最长递增子序列的长度

    解法

    使用工具栈单枝遍历数组(思路源于工具栈能够双枝遍历二叉树的方法)

    栈里存放的是数组的下表,在栈里从栈底到栈顶其下标相应的值是从小到大的

    比如数组 data[]={-9,0,-3,-5,-1,-2}

    最后求得最长递增子序列的长度为 3 (-9,-3,-1),当然还有好几种同种长度的递增子序列的组合

    核心算法:

    C++表示算法例如以下:

    // 求数组中最长递增子序列
    	int Array::Max_Length_GoUp_stack(int *data,unsigned int const length)
    	{
    		// 异常输入
    			if(data == NULL || length == 0)
    			{
    				cout<<"输入异常 Max_Length_GoUp"<<endl;
    				return 0;
    			}
    		// 正常输入
    			else
    			{
    				// 核心算法,用工具栈去解决这个问题
    					stack<unsigned int> * S = new stack<unsigned int>;
    					S->push(0);
    					unsigned int now = 0;
    					unsigned int result = 1;
    					while(S->empty() == false)
    					{
    					// 能够进栈
    						now ++;
    						if(now < length)
    						{
    							while(now < length)
    							{
    								if(data[now] > data[S->top()])
    								{
    									S->push(now);
    								}
    								now++;
    							}
    
    							// 更新结果
    							if(S->size() > result)
    								result = S->size();
    						}
    
    
    					// 出栈操作
    						else{
    							now = S->top();
    							S->pop();
    						}
    					}
    				// 返回结果
    					return result;
    			}
    	}
    





  • 相关阅读:
    终端不显示 git branch 名字
    多线程下bufferedwriter若不关闭并不能记下所有log
    anaconda prompt execute jupyter notebook, can't open notebook
    conda 创建新环境下载包失败
    failed to install jupyter_contrib_nbextensions
    failed to install nb_conda
    Windows Server 2012R2 修复CVE-2016-2183(SSL/TLS)漏洞的办法
    SSL/TLS协议信息泄露漏洞(CVE-2016-2183)解决办法
    记录win NFS公网映射开放端口
    出题器
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4384624.html
Copyright © 2020-2023  润新知