力扣15.三数之和(双指针)

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> ans = new ArrayList<>();
        int n = nums.length;
        for (int i = 0; i < n-2; i++) {
            int x = nums[i];
            if (i > 0 && x == nums[i-1]) continue;
            if (x + nums[i+1] + nums[i+2] > 0) break;
            if (x + nums[n-1] + nums[n-2] < 0) continue;
            int j = i + 1;
            int k = n - 1;
            while (j < k) {
                int s = x + nums[j] + nums[k];
                if (s > 0) {
                    k--;
                } else if (s < 0) {
                    j++;
                } else {
                    ans.add(List.of(x, nums[j], nums[k]));
                    j++;
                    k--;
                    while (j < k && nums[j] == nums[j-1]) {
                        j++;
                    }
                    while (k > j && nums[k] == nums[k+1]) {
                        k--;
                    }
                }
            } 
        }
        return ans;
    }
}
  • 有两层循环,第一层枚举第一个数,第二层双指针向内进行查找
  • 解决重复问题:先进行排序,对于外层nums[i]和nums[i-1]进行比较,如果相同直接continue跳过,内层的nums[i]和nums[j]也是如此比较跳过重复部分
  • 两个优化,如果if (x + nums[i+1] + nums[i+2] > 0) break;如果紧邻的两个数相加都>0说明后面更大的数肯定更大,就没必要再比较了;if (x + nums[n-1] + nums[n-2] < 0) continue;如果这个最外层的nums[i]和最大的两个数都还<0,说明最外层的这个数字需要变得更大,直接continue进行下一个计算
posted @ 2025-12-29 16:33  Huangyien  阅读(7)  评论(0)    收藏  举报