You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用双指针法解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:12:55