找出函数的最宽尖峰
【题目描述】按数组的形式给出函数f(x)的取值,即数组A的A[0]元素为f(0)的取值,数组的取值都为整数,函数在每个点都是严格单调递增或者严格递减(即A[i-1] != A[i] != A[i+1]),要求找出最宽的先上升后下降的区间(这个区间内函数的值必须先上升到一个点然后下降,区间的上升段和下降段长度必须都大于0)。
1. 如果找到符合条件的最大区间输出数组对应的左右下标(保证只有一个最大区间)
2. 找不到那么输出-1 -1
输入格式
n
n长度的整数数组
输出格式
区间的范围
输入样例
10
1 3 1 2 5 4 3 1 9 10
输出样例
2 7
数据规模
对于 100% 的数据,1 <=n <=10, 000, 000




#include <bits/stdc++.h> using namespace std;//预处理左右各做一遍最长上升子串, 然后维护一个最大和即可 int main() { int n; cin >> n; vector<int> x(n, 0); vector<int> l(n, 0); vector<int> r(n, 0); for(int i = 0; i < n; i++) scanf("%d", &x[i]); for(int i = 1; i < n; i++) { if(x[i] > x[i - 1]) { l[i] = l[i - 1] + 1; } } for(int i = n - 2; i >= 0; i--) { if(x[i] > x[i + 1]) { r[i] = r[i + 1] + 1; } } int mx = 0, ll = -1, rr = -1; for(int i = 0; i < n; i++) { if(l[i] > 0 && r[i] > 0 && l[i] + r[i] > mx) { mx = l[i] + r[i]; ll = i - l[i]; rr = i + r[i]; } } cout << ll << " " << rr << endl; return 0; }