使用双指针法解决LeetCode三数之和问题时为何出现数组越界异常?
三数之和双指针法数组越界问题修复
错误原因
抛出java.lang.ArrayIndexOutOfBoundsException的核心问题是右指针R的更新逻辑错误:
当nums[L]+nums[R] > target时,代码中写了R+=1,但数组已升序排序,此时需要减小总和,应将R左移(R--)而非右移。右移会让R超出数组最大索引(比如长度为6的数组,最大索引是5,R++后变成6,直接触发越界)。
修复后的代码
import java.util.Arrays; import java.util.ArrayList; import java.util.List; class Solution { public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); List<List<Integer>> ans = new ArrayList<>(); for(int i=0;i<=nums.length-3;i++){ if(i==0 || nums[i]!=nums[i-1]){ int L=i+1; int R = nums.length-1; int target = 0 - nums[i]; while(L < R){ if(nums[L]+nums[R]==target){ List<Integer> temp = new ArrayList<>(); temp.add(nums[i]); temp.add(nums[L]); temp.add(nums[R]); ans.add(temp); // 跳过L的重复值 while(L < nums.length-1 && nums[L]==nums[L+1]) L++; // 跳过R的重复值 while(R > 0 && nums[R]==nums[R-1]) R--; L++; R--; }else if(nums[L]+nums[R] < target){ L++; }else{ // 修复为R--,而非R++ R--; } } } } return ans; } }
额外说明
- 数组排序后,双指针移动需遵循升序特性:总和小于目标则左指针右移(找更大的数),总和大于目标则右指针左移(找更小的数)。
- 现有去重逻辑正确,可避免重复三元组加入结果集。
内容的提问来源于stack exchange,提问作者Amresh Singh
相关产品推荐
相关产品推荐

