有数组int a[] = {1, 2, 3, 4, 5, 8, 6, 3, 0, 6, 2, 4, 8, 1, 0, 8, 5, 6, 2, 5, 9, 10, 8, 6};
打印出升序的最长的一个子序列,比如这里从1开始到8的序列最长。
这里包含两个问题:
1 找到升序的序列:
序列可以用一个二元组表示 {起始位置,长度},或者{起始位置,终止位置} 或者 {终止位置,长度}。三者等价。
2 在找到的序列中,找到最长的一个。
那么可以在符合条件的二元组中遍历,找到长度最大的。
因为这个题目说找到一个就可以,那么可以将两个问题放到一块做。
嗯,不多说,看代码
int a[] = {1, 2, 3, 4, 5, 8, 6, 3, 0, 6, 2, 4, 8, 1, 0, 8, 5, 6, 2, 5, 9, 10, 8, 6};
int end, size, mark_end, mark_size; //找到的序列用mark保存
end = mark_end = 0;
size = mark_size = 1;
for (int i=1; i< sizeof(a); i++)
{
if(a[i] > a[end]) //如果后一个数比序列尾巴大,增加当前的序列长度
{
size++;
}
else //否则当前序列结束。保存当前序列。并重新开始寻找
{
if(size > mark_size) //比之前找到的序列更长,那么保存下来
{
mark_size = size;
mark_end = end;
}
size = 1; //重置序列长度
}
end = i; //移动当前序列的最后位置
}
if(size>mark_size) //处理一下循环最后没有比较的序列
{
mark_size = size;
mark_end = end;
}