#include
#include
using namespace std;
#define N 14
int main() {
/*4. 分离:给定一个数组,将其在局部最小值和局部最大值处进行分离,输出长
度最长的那段序列,并且输出其起止位置。如:2 1 0 1 3 4 2 1 -1 0 1 2 3 5
输出:2 1 0,0 1 3 4,4 2 1 -1,-1 0 1 2 3 5
最长序列为 -1 0 1 2 3 5,起 9 止 14*/
int name[14] = { 2, 1, 0, 1 ,3, 4 ,2, 1 ,-1, 0 ,1, 2, 3 ,5 };
for (int i = 0; i < 14; i++) {
cout << setw(3) << name[i];
if (name[i] < name[i - 1] && name[i] < name[i + 1] && i>2) {
cout << "," << endl;
cout <3)<<name[i];
}
if (name[i] > name[i - 1] && name[i] >name[i + 1] && i>2) {
cout << "," << endl;
if(i<13)
cout << setw(3) << name[i];
}
}
return 0;
}
觉得可行还请 采纳:
可以使用双指针算法来实现:设两个指针left和right,一开始把它们都指向0,然后向后移动,直到找到第一个局部最小值,把left移到该位置,然后再向后移动,直到找到下一个局部最小值,把right移到该位置,继续重复此过程,直到right移到最后一个元素为止。最后,取left和right之间的区间长度最大的区间,即为最长序列。
代码如下:
#include <iostream>
using namespace std;
#define N 14
int main() {
int name[N] = { 2, 1, 0, 1 ,3, 4 ,2, 1 ,-1, 0 ,1, 2, 3 ,5 };
int left = 0, right = 0, max_len = 0, start = 0;
for (int i = 1; i < N; i++) {
if (name[i] > name[i - 1]) {
right = i;
} else {
if (right - left + 1 > max_len) {
max_len = right - left + 1;
start = left;
}
left = i;
}
}
if (right - left + 1 > max_len) {
max_len = right - left + 1;
start = left;
}
cout << "最长序列为:";
for (int i = start; i < start + max_len; i++) {
cout << name[i] << " ";
}
cout << ",起 " << start << " 止 " << start + max_len - 1 << endl;
return 0;
}