Loading...

三指针-三数之和

在这里插入图片描述

求解代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 public ArrayList<ArrayList<Integer>> threeSum (int[] num) {
        ArrayList<ArrayList<Integer>> ans = new ArrayList<ArrayList<Integer>>();
        Arrays.sort(num);

        for(int i=0;i<num.length && num[i]<=0;i++){
            if(i>0&&num[i]==num[i-1]){
                continue;
            }
            int j=i+1,k=num.length-1;
            while (j<k) {
                int valuei=num[i];
                int valuej=num[j];
                int valuek=num[k];
                int sum = valuei+valuej+valuek;
                if(sum==0){
                    ans.add(new ArrayList<>(Arrays.asList(valuei,valuej,valuek)));
                }
                if(sum>0){
                    while (j<k&&num[k]==valuek) {
                        k--;
                    }
                }else{
                    while (j<k&&num[j]==valuej) {
                        j++;
                    }
                }
            }
        }
        return ans;
    }

小贴士

  • continue所在语句块的num[i]==num[i-1]主要是跳过重复的基准数,避免生成重复三元组。
  • num[j]==valuejnum[k]==valuek的作用也是一样的,本质上都是排序后数组的「重复元素相邻」,要跳过重复值。
  • 第一个if语句只负责「添加结果」,和后续的逻辑无关,第二个独立的if-else负责「指针移动+去重」,覆盖所有情况。
最后更新于 2026-04-05 17:35:33
Code Road Record