C++ 中数组中的最长山脉
考虑任何(连续)子数组 B(A 的子数组)称为山脉,如果满足以下属性:
- B 的大小 >= 3
- 存在某个 0 < i < B.length - 1 使得 B[0] < B[1] < ... B[i-1] < B[i] > B[i+1] > ... > B[B.length - 1]
假设我们有一个整数数组 A;我们必须找到最长山脉的长度。如果不存在山脉,则必须返回 0。因此,如果输入类似于 [2,1,4,7,3,2,5],则结果将为 5。因此,最大的山脉将是 [1,4,7,3,2],其长度为 5。
为了解决这个问题,我们将遵循以下步骤:
- ret := 0,n := 数组 a 的大小
- i := 0 到 n – 1,i 增加 j + 1
- j := i
- down := false,up := false
- 当 j + 1 < n 且 a[j + 1] > a[j] 时
- up := true 并将 j 增加 1
- 当 up 为 true 且 j + 1 < n 且 a[j + 1] > a[j] 时
- down := true 并将 j 增加 1
- 如果 up 和 down 都为 true,则将 ret 设置为 j – i + 1 和 ret 的最大值,将 j 减 1
- 返回 ret。
让我们看看以下实现以获得更好的理解:
示例
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int longestMountain(vector<int>& a) {
int ret = 0;
int n = a.size();
int j;
for(int i = 0; i < n; i = j + 1){
j = i;
bool down = false;
bool up = false;
while(j + 1 < n && a[j + 1] > a[j]) {
up = true;
j++;
}
while(up && j + 1 < n && a[j + 1] < a[j]){
down = true;
j++;
}
if(up && down){
ret = max(j - i + 1, ret);
j--;
}
}
return ret;
}
};
main(){
vector<int> v = {2,1,4,7,3,2,5};
Solution ob;
cout << (ob.longestMountain(v));
}输入
[2,1,4,7,3,2,5]
输出
5
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP