最大连续递增子序列

    我不生产自己不熟悉的内容,我只是陌生内容的搬运工!向原作致敬!

    我不想完全粘贴复制别人的内容,借鉴的同时加上自己的一些理解或者修正一些我认为原文中不正确的地方。首先来看一道相关的题目,链接在这里,不点看不到哦:http://codeforces.com/contest/580/problem/A,要求的就是最长的非递减连续子序列。连续,意味着子序列是原序列中的一个片段,而非零零散散的非递减数组成的序列。题目可以利用数组,也可以使用容器,为了方便我使用了容器,代码如下:

#include
#include
using namespace std;
typedef long long ll;
vector v, u;
int main()
{
    int n, i,j;
    ll a;
    cin >> n;
    for (i = 0; i < n; ++i)
    {
        cin >> a;
        v.push_back(a);
    }
    u.push_back(1);
    for (i = 1; i < n; ++i)
    {
        u.push_back(1);
        j = i - 1;
        if (v[i] >= v[j])
            u[i] = u[j] + 1;
    }
    ll max = 0;
    for (i = 0; i < n; ++i)
        if (u[i]>max)
            max = u[i];
    cout << max << endl;
    return 0;
}
    数组中的数是乱序的,求数组中最大的连续子序列,主要有两种方法,上面的代码是第一种实现方法,下面我将对两种实现方法做具体的介绍。

    方法一:做一个辅助数组list[length]用来记录下数组中每个元素对应的最大子序列长度,默认为1,表示从该元素后没有连续的序列。当第i个元素比第i-1个元素大的时候,则将第i-1个元素的长度加1即为第i个元素的最大序列长度。最后从list[]中找到最大值max即为最大连续子序列长度。该方法的优点是思路清晰,代码简单易懂;缺点是需要一个额外的数组list,复杂度为O(n*n)(这地方我不理解,我觉得原文里有错误,这里应该是O(n))。代码如下:

#include
using namespace std;

int List_length(int a[],int length)
{
	int *list = new int[length];
	int i,j;
	list[0] = 1;
	for(i=1;ia[j] )//&& list[j]+1>list[i]
			list[i] = list[j]+1;
	}
	int max  = 0;
	for(i=0;imax)
			max = list[i];
	}
	return max;

}

void main()
{
	int a[5] = {-2,-1,3,4,0};
	int num = List_length(a,5);
	cout<<"The Maximum subsequence's length is:"<
    方法二:采用两个指针p,q遍历数组,从第一个元素开始,p指向第一个元素,q指向p的下一个元素,如果数组是递增的,则q依次++后移,用max记录递增区间。当遇到不再是递增的区间时,判断此时q-1到p之间的长度是否大于max,更新max。将p移动到q的位置,q再依次后移做比较。当q移动到数组最后还是递增时,则判断p到q的区间长度是否大于max,更新max。期间可以用i和j记录区间的起始和终止位置。该方法的时间复杂度低,且不需要额外的数组空间,只需要一个max记录最大区间长度,而且可以记录最大区间的起始和终止位置,输出该段区间内的元素。代码如下:

#include  
using namespace std;
#define maxn 100002
int a[maxn];
int n;
int List_length(int a[], int length)
{
	int max = 1;
	int p = 0, q;
	for (q = p+1; qmax)//新的递增长度比原来递增的长度长时,修改保存的数;长度相等的情况也没有考虑  
				max = q - p;	
			p = q;//将p指向新的起点  
		}
		else if (q == length - 1)//判断q走到结束的时候,前面是乱序,后面是递增的情况。  
		{
			if (q - p + 1>max)
			{
				max = q - p + 1;
			}
		}
	    else if((q-p)==length)//这里是全部都是递增的情况
		{
			max = length;
		}
	}
	return max;
}
int main()
{
	cin >> n;
	for (int i = 0; i < n; ++i)
		cin >> a[i];
	cout << List_length(a, n) << endl;
	return 0;
}







    

你可能感兴趣的:(C++)