文章
173
粉丝
0
获赞
0
访问
29.6k
(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...
登录后发布评论
暂无评论,来抢沙发