1-9 最长连续递增子序列 (20分)
给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。
输入格式:
输入第1行给出正整数n(≤10e5);第2行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出第一次出现的最长连续递增子序列,数字之间用空格分隔,序列结尾不能有多余空格。
输入样例:
15
1 9 2 5 7 3 4 6 8 0 11 15 17 17 10
输出样例:
3 4 6 8
AC代码:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100000
struct
{
int data;
int Last;
} List[MAXSIZE];
int main()
{
int n,i,j;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d",&List[i].data);
List[i].Last=1;
}
for(i=0; i<n-1; i++)
{
for(j=i+1; j<n; j++)
{
if(List[j].data>List[j-1].data)
List[i].Last++;
else
break;
}
}
int count=1,d;//count用来记录最大顺序,d用来记录下标
for(i=0; i<n; i++)
{
if(List[i].Last>count)
{
count=List[i].Last;
d=i;
}
}
for(i=d; i<count+d-1; i++)
{
printf("%d ",List[i].data);
}
printf("%d",List[count+d-1].data);
return 0;
}
我写的【已改正】
参考链接在此
1-9 最长连续递增子序列 (20 分)
第一,当n=1是,输入只有一个数,我接着给他输出,在return 0;退出程序即可。这个数本身就是最大递增子序列
第二,如果n=3,输入的三个数为1 2 3,那么1 2 3就是 最长连续递增子序列,即为所求;但是如果输入的是3 2 1呢,max此时等于1,全都等于1,我该输出哪一个呢?
我也不太明白,后来测试后发现,如果默认输出第一个数据,结果是AC的,但是其他就不行,这可能是一直先入为主的概念吧。
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
int Last;//用于存储以当前元素开始连续递增的数字个数
};
int main() {
int i,j;
int n;
scanf("%d",&n);
if(n<1)
return 0;
if (n==1) {
int data;
scanf("%d",&data);
printf("%d",data);
return 0;
}
struct node A[n];
for(i=0; i<n; i++) {
scanf("%d",&A[i].data);
A[i].Last=1;
}
for(i=0; i<n-1; i++) {
for(j=i+1; j<n; j++) {
if(A[j-1].data<A[j].data)
A[i].Last++;
else
break;
}
}
int max=A[0].Last;//最大递增次数
int begin=0;//最长递增子序列开始的位置
//这里我默认都是第一个数
for(i=0; i<n; i++) {
if(A[i].Last>max) {
max=A[i].Last;
begin=i;
}
}
/* if (max==1) {
int m=A[0].data;
for(i=1; i<n; i++) {
if (A[i].data>m)
m=A[i].data;
}
printf("%d",m);
return 0;
}
这里的查找最大元素不是必要的
*/
int cnt=0;
for(i=begin; i<begin+max; i++) {
if(cnt++)
printf(" ");
printf("%d",A[i].data);
}
return 0;
}
数组【月测】
后来月考的时候,我又考了这个题,这次换了一种方法,我用数组写的,也过了。
这种用一个数组来标记的方法,我感觉很好,以后可以经常使用的。
#include<iostream>
using namespace std;
int a[999999];
int main() {
int n;
cin>>n;
int ex[n]= {0};
for(int i=0; i<n; i++) {
cin>>a[i];
}
if(n<=0)
return 0;
for(int i=0; i<n-1; i++) {
for(int j=i+1; j<n; j++) {
if(a[j-1]<a[j])
ex[i]++;
else
break;
}
}
int max=ex[0];
int begin=0;
for(int i=0; i<n; i++) {
if(ex[i]>max) {
max=ex[i];
begin=i;
}
}
int cnt=0;
for(int i=begin; i<=begin+max; i++) {
if(cnt++)
cout<<" ";
cout<<a[i];
}
return 0;
}