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; }
代码逻辑说明
- 边界检查:先排除长度小于3的数组,这类数组不可能是山脉数组。
- 找递增终点:从左往右走,直到下一个元素不大于当前元素,此时的位置就是潜在峰值。
- 峰值合法性检查:如果峰值在数组第一个或最后一个位置,直接返回false(因为山脉必须有升有降)。
- 检查递减阶段:从峰值位置继续向右走,直到下一个元素不小于当前元素,如果最终走到数组末尾,说明整个递减阶段是严格连续的。
- 结果判断:只有当递减阶段走到数组末尾时,才符合山脉数组的要求。
原逻辑出错原因
原逻辑仅关注了“最大值左右元素都小于最大值”,但忽略了“递增/递减的连续性”。比如测试用例中,最大值5的左侧虽然所有元素都小于它,但中间出现了下降,这违反了“从起点到峰值必须一直严格递增”的要求,而双指针法通过连续遍历的方式,确保了递增和递减过程没有中断。
内容的提问来源于stack exchange,提问作者Yohaan Seth Nathan
相关产品推荐
相关产品推荐

