我解HackerRank中等难度Pairs题的解法错误出在哪里?
代码错误排查与修正方案
你的代码存在以下三个核心问题,导致用例通过率低:
- 主逻辑覆盖不全:仅在相邻元素差值小于k时检查
i+1位置和前置元素的配对,大量跨多个位置的合法配对无法被触发检查。例如数组[1,3,5]、k=4的场景,1和5的差值符合要求,但你的代码遍历全程都不会识别到该配对,最终返回错误结果0。 CompareWithPreviousValues方法循环逻辑错误:循环中同时对遍历下标i自减、对间距j自增,两个变量同步变化导致根本无法完整遍历当前元素的所有前置元素,大部分历史元素都会被直接跳过。- 匹配到单条结果就直接返回导致统计缺失:如果存在重复元素,例如数组
[1,1,2,2]、k=1的场景,合法配对共有4个,但你的方法匹配到第一个配对就直接返回,仅能统计到1个结果。
修正方案
推荐用逻辑更清晰的双指针法实现,时间复杂度和你原设计一致,为排序的O(nlogn),空间复杂度O(1):
public static int pairs(int k, List<int> arr) { arr.Sort(); int result = 0; int left = 0; int right = 1; while (right < arr.Count) { int diff = arr[right] - arr[left]; if (diff == k) { result++; left++; right++; // 若题目允许重复元素,可添加以下代码处理连续重复的情况 while (right < arr.Count && arr[right] == arr[right - 1] && arr[left] == arr[left -1]) { result++; left++; right++; } } else if (diff < k) { right++; } else { left++; // 避免左右指针重合 if (left == right) { right++; } } } return result; }
内容的提问来源于stack exchange,提问作者David Oganov
相关产品推荐
相关产品推荐

