文章
156
粉丝
195
获赞
0
访问
28.5k
1)
关键观察:
要找 max(峰A[i] - 谷A[j]),且 i < j。
也就是说,对于每个谷 A[j],我们只能考虑它之前的峰。
那么,如果我们从左到右扫描,记录到当前位置之前遇到的最大的峰的值,那么对于每个谷,我们直接计算 max_peak_so_far - A[j],并更新全局最大值。
步骤:
先找出所有峰和谷的位置(一次遍历)。
从左到右扫描数组,维护一个变量 max_peak 表示当前位置之前(包括当前位置)遇到的所有峰的最大值(初始化为一个很小的数,比如 -∞)。
当遇到一个谷时,计算 max_peak - 谷值,更新全局最大差值。
当遇到一个峰时,更新 max_peak = max(max_peak, 峰值)。
注意:峰必须在谷之前(i < j),所以更新峰后再遇到谷才有效。
实际上我们按顺序扫描数组,先更新峰,再在遇到谷时计算差值。
2)
int findMaxPeakValleyPair(vector<int>& A) {
int n = A.size();
if (n < 3) return 0;
int max_peak = INT_MIN;
int max_diff = 0;
for (int i = 1; i < n - 1; i++) {
// 检查是否为峰
if (A[i] > A[i-1] && A[i] > A[i+1]) {
if (A[i] > max_peak) max_peak = A[i];
}
// 检查是否为谷
if (A[i] < A[i-1] && A[i] < A[i+1]) {
if (max_peak != INT_MIN) {
int diff = max...
登录后发布评论
暂无评论,来抢沙发