#include <iostream>
#include<iomanip>
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 <<setw(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;
}
怎么实现输出最长序列起止位置啊?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- CodeBytes 2023-01-31 22:49关注
觉得可行还请 采纳:
可以使用双指针算法来实现:设两个指针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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥20 wireshark抓不到vlan
- ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
- ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
- ¥15 stata安慰剂检验作图但是真实值不出现在图上
- ¥15 c程序不知道为什么得不到结果
- ¥40 复杂的限制性的商函数处理
- ¥15 程序不包含适用于入口点的静态Main方法
- ¥15 素材场景中光线烘焙后灯光失效
- ¥15 请教一下各位,为什么我这个没有实现模拟点击
- ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来