You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Valid Mountain Array编程判断求助:现有C代码存在误判问题

解决Valid Mountain Array的误判问题

你的代码逻辑存在核心漏洞:仅通过最大值位置检查左右元素是否小于最大值,无法保证从数组起点到峰值是连续严格递增,以及从峰值到数组末尾是连续严格递减。比如输入1 3 2 5 4 3 2 0,最大值是5,但左侧存在3→2的下降段,这不符合山脉数组“先一直升、再一直降”的要求,但你的逻辑会误判为符合条件。

正确的判断逻辑

山脉数组必须满足以下条件:

  • 数组长度至少为3
  • 存在唯一的峰值点,且峰值不在数组的第一个或最后一个位置
  • 从数组起点到峰值,每个相邻元素严格递增
  • 从峰值到数组末尾,每个相邻元素严格递减

修正后的C语言实现(双指针法)

#include <stdbool.h>
#include <stdio.h>

bool validMountainArray(int* arr, int arrSize) {
    // 边界判断:长度不足3直接返回false
    if (arrSize < 3) return false;

    int left = 0;
    // 从左向右遍历,找到递增的终点(峰值)
    while (left + 1 < arrSize && arr[left] < arr[left + 1]) {
        left++;
    }

    // 峰值不能在数组两端
    if (left == 0 || left == arrSize - 1) return false;

    // 从峰值位置向右遍历,检查是否严格递减到数组末尾
    while (left + 1 < arrSize && arr[left] > arr[left + 1]) {
        left++;
    }

    // 如果遍历到数组末尾,说明符合条件
    return left == arrSize - 1;
}

// 测试示例
int main() {
    int testArr[] = {1, 3, 2, 5, 4, 3, 2, 0};
    int size = sizeof(testArr) / sizeof(testArr[0]);
    printf("%s\n", validMountainArray(testArr, size) ? "True" : "False"); // 输出False
    return 0;
}

代码逻辑说明

  1. 边界检查:先排除长度小于3的数组,这类数组不可能是山脉数组。
  2. 找递增终点:从左往右走,直到下一个元素不大于当前元素,此时的位置就是潜在峰值。
  3. 峰值合法性检查:如果峰值在数组第一个或最后一个位置,直接返回false(因为山脉必须有升有降)。
  4. 检查递减阶段:从峰值位置继续向右走,直到下一个元素不小于当前元素,如果最终走到数组末尾,说明整个递减阶段是严格连续的。
  5. 结果判断:只有当递减阶段走到数组末尾时,才符合山脉数组的要求。

原逻辑出错原因

原逻辑仅关注了“最大值左右元素都小于最大值”,但忽略了“递增/递减的连续性”。比如测试用例中,最大值5的左侧虽然所有元素都小于它,但中间出现了下降,这违反了“从起点到峰值必须一直严格递增”的要求,而双指针法通过连续遍历的方式,确保了递增和递减过程没有中断。

内容的提问来源于stack exchange,提问作者Yohaan Seth Nathan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:39:49