AlmostIncreasingSequence算法特殊失败用例最小修改方案咨询
AlmostIncreasingSequence 实现问题排查与修复
现有代码的核心逻辑缺陷
- 你当前的实现仅统计相邻递减对的数量和重复元素总数,但是忽略了一个核心场景:单次相邻递减可能同时影响前后两组元素的递增性,也就是出现递减时,无论删除前一个元素还是后一个元素,都可能产生新的递减对。
你给出的测试用例[40, 50, 60, 10, 20, 30]就是典型情况:
代码统计到的递减对只有
60→10这1组,所以判定返回true,但实际上删除60后会出现50→10的新递减对,删除10后会出现60→20的新递减对,无法通过删除1个元素满足要求,正确返回值应为false。
另外你代码中的重复元素统计逻辑也有冗余问题:重复元素本身就会被相邻比较的逻辑统计为arr[i] <= arr[i-1],不需要单独判断,反而可能导致重复计数。
最小改动修复方案
只需要在统计到递减对时,额外判断一次删除操作是否会引发新的递减即可,不需要重构整体逻辑:
bool almostIncreasingSequence(int[] arr) { int removed = 0; if(arr.Length <= 2) return true; for(int i = 1; i < arr.Length ; i++) { if(arr[i] <= arr[i-1]) { removed++; // 新增判断:删除任意元素都无法解决递减,直接返回false if(i > 1 && i < arr.Length -1 && arr[i] <= arr[i-2] && arr[i+1] <= arr[i-1]) { return false; } // 最多删1个,超过直接返回 if(removed > 1) return false; } } return removed <= 1; }
改动说明
- 移除了冗余的重复元素统计逻辑,相邻比较会自然覆盖重复场景
- 出现递减对时增加边界判断:如果当前元素比前前个小,同时后一个元素比前一个小,说明无论删哪个都无法解决问题,直接返回false
- 提前终止:删除次数超过1时直接返回,不需要遍历完整个数组
测试用例验证
对于[40, 50, 60, 10, 20, 30],遍历到i=3(元素10)时:
- 满足
arr[3] <= arr[2],removed变为1 - 满足
i>1 && i < arr.Length-1,同时arr[3] <= arr[1](10<=50)且arr[4] <= arr[2](20<=60),直接返回false,符合预期。
内容的提问来源于stack exchange,提问作者João Gabriel
相关产品推荐
相关产品推荐

