题目描述:设计一个O(n^2)时间的算法,找出由n个数字组成的序列的最长单调递增子序列。要求:(1)写出分析思路;(2)给出具体算法。
分析思路
从所给数组的第一个数开始,向后依次计算以此元素开始的最长单调递增子序列的长度,将此长度记录在
max
中,找出max
的最大值,并将该递增序列的首元素的下标记录在c
中,最后依序输出。
具体算法
输出的序列为连续的:
#include<stdio.h>
int main() {
int max = 0, count = 1,n = 7;
int b, c;
int a[] = { 2,1,4,7,8,-1,20 };
for (int i = 0; i < n; i++) {
b = a[i];
for (int j = i + 1; j < n; j++) {
if (b < a[j]) {
b = a[j];
count++;
}
else break;
}
if (max < count) {
max = count;
c = i;
}
count = 1;
}
printf("%d ",a[c]);
b = a[c];
for (int i = c + 1; i < n; i++) {
if (b < a[i]) {
b = a[i];
printf("%d ", b);
}
else break;
}
return 0;
}
输出的序列为非连续的:
#include<stdio.h>
int main() {
int max = 0, count = 1,n = 7;
int b, c;
int a[] = { 2,1,4,7,8,-1,20 };
for (int i = 0; i < n; i++) {
b = a[i];
for (int j = i + 1; j < n; j++) {
if (b < a[j]) {
b = a[j];
count++;
}
}
if (max < count) {
max = count;
c = i;
}
count = 1;
}
printf("%d ",a[c]);
b = a[c];
for (int i = c + 1; i < n; i++) {
if (b < a[i]) {
b = a[i];
printf("%d ", b);
}
}
return 0;
}