为何判断数组是否为单调数组的代码无法正常运行?
问题分析与修复
你的代码无法正确判断单调数组的原因有以下几点:
错误的标记逻辑:当前代码只要发现任意一对递增元素就设
inc为true,任意一对递减元素就设dec为true,但真正的单调递增数组要求全程没有递减的元素对,单调递减数组要求全程没有递增的元素对。比如数组[1,3,2]会被错误判定为true,因为它既有递增又有递减的元素对。错误的最终判断条件:代码通过
dec || inc == true返回结果,这会让同时存在递增和递减步骤的数组也返回true,不符合单调数组的定义。未处理全相等数组:像
[5,5,5]这样的数组,既没有递增也没有递减的元素对,inc和dec都会保持false,导致返回false,但实际上它属于单调数组(既是非递增也是非递减)。
修复后的代码
我们只需要一次遍历数组,同时跟踪数组是否可能为递增或递减:
public boolean isMonotonic() { boolean isIncreasing = true; boolean isDecreasing = true; for (int i = 0; i < values.length - 1; i++) { if (values[i] < values[i+1]) { // 出现递增,说明不可能是递减数组 isDecreasing = false; } else if (values[i] > values[i+1]) { // 出现递减,说明不可能是递增数组 isIncreasing = false; } // 相等的情况不改变两个标记 } // 只要其中一个标记为true,说明数组是单调的 return isIncreasing || isDecreasing; }
逻辑说明:
- 初始化
isIncreasing和isDecreasing为true,假设数组同时满足两种可能。 - 遍历数组时,遇到递增对就排除递减的可能,遇到递减对就排除递增的可能。
- 最后只要其中一个标记仍为true,就说明数组是单调的(全相等的情况两个标记都会保持true)。
内容的提问来源于stack exchange,提问作者Mohammad Alshakeralasir
相关产品推荐
相关产品推荐

