文章
78
粉丝
0
获赞
0
访问
3.4k
(1)首先遍历数组,记录所有峰和谷的位置。峰的位置满足 A[i] > A[i-1] 且 A[i] > A[i+1],谷的位置满足 A[i] < A[i-1] 且 A[i] < A[i+1]。
对于每一个峰的位置 i
,我们需要在 i
之后的所有谷中找到最小的 A[j]
,因为 A[i] - A[j]
的最大值对应于 A[j]
的最小值。
为了提高效率,可以预处理谷的最小值数组 min_valley
,其中 min_valley[j]
表示从位置 j
到数组末尾的最小谷值。
然后对于每一个峰 i
,找到 i
之后的最小谷值,计算 A[i] - min_valley_after_i
,并记录最大值。
(2)
int findMaxPeakValleyDifference(int A[], int n) { if (n < 3) return 0; // 至少需要3个元素才能有峰或谷 int max_diff = 0; int min_valley_after = INT_MAX; // 当前峰之后的最小谷值 // 从后往前遍历,记录当前的最小谷值 for (int i = n - 2; i >= 1; --i) { if (A[i] < A[i-1] && A[i] < A[i+1]) { // 谷 if (A[i] < min_valley_after) { min_valley_after = A[i]; } } else if (A[i] > A[i-1] && A[i] > A[i+1]) { // 峰 if (min_valley_after != INT_MAX) { int curren...
登录后发布评论
暂无评论,来抢沙发