问题描述

给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)
输入格式:
输入第1行给出正整数n(≤105);第2行给出n个整数,其间以空格分隔。

输出格式:

在一行中输出第一次出现的最长连续递增子序列,数字之间用空格分隔,序列结尾不能有多余空格。

输入样例:
15
1 9 2 5 7 3 4 6 8 0 11 15 17 17 10
输出样例:
3 4 6 8
数据结构:

struct node
{
int data; //一个用来存元素data
int count; //一个用来计从目前这个元素到最后一个元素之间的最长 //能够递增的数
}s[100001]

设计思路:

利用结构体的好处是省去创建两个数组的麻烦。
通过嵌套for循环实现当前元素与后面的比对,如果后一个元素大于这个元素,那么count++,一旦遇到两两之间不满足递增关系的,则break;所以count也就不再计数了。
最后对所有元素的count进行比较,找出最大的,从这个最大的元素开始往后输出相应count数个元素,即满足题目的要求。

C++ AC
#include <stdio.h>
#include <stdlib.h>
 struct node
{
    int data;
    int count;
}s[100001];
int main()
{
    int n,i,j;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&s[i].data);
        s[i].count=1;
    }
    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n+1;j++)
        {
            if(s[j].data>s[j-1].data)
                s[i].count++;
            else
                break;
        }
    }
    int sum=0,t,z;
    for(i=0;i<n;i++)
    {
        if(sum<s[i].count)
            {sum=s[i].count;
            t=i;}
    }

    for(z=t;z<sum+t-1;z++)
    {
        printf("%d ",s[z].data);
    }
     printf("%d",s[z].data);


}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐