如何用双指针遍历有序数组查找和为20的元素对并返回较小值索引
双指针查找升序数组和为20元素对 修正方案
原代码核心问题
- 错误使用两层for循环实现双指针逻辑,双指针仅需单次循环移动左右索引即可,时间复杂度为O(n),远优于两层循环的O(n²)
- 未正确移动指针索引,反而直接修改输入数组的元素值,导致数组原始值被破坏,逻辑完全偏离预期
- 找到符合条件的元素对后做了无意义的大小判断:升序数组左指针对应值必然小于右指针值,左索引就是较小值的索引
- 初始返回值设置错误,未命中时应返回-1而非数组长度
修正后的代码
checkSum方法:
public static int checkSum(int[] array){ // 左指针初始在数组头部 int left = 0; // 右指针初始在数组尾部 int right = array.length - 1; while (left < right) { int sum = array[left] + array[right]; if (sum == 20) { // 升序数组左值更小,直接返回左索引 return left; } else if (sum > 20) { // 和大于20,右指针左移 right--; } else { // 和小于20,左指针右移 left++; } } // 遍历完没找到符合条件的对 return -1; }
main测试方法无需修改,运行后四个测试用例均可正常通过,不会抛出错误提示。
内容的提问来源于stack exchange,提问作者Paige
相关产品推荐
相关产品推荐

