Skip to content

15. 三数之和

直觉

排序,先固定一个最左边的数,然后进行两数之和的计算。

java
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 l = i + 1, r = nums.length - 1;
            int target = -nums[i];
            if (i > 0 && nums[i] == nums[i - 1])
                continue;
            if (nums[i] + nums[l] > 0)
                break;
            if (nums[i] + nums[n - 2] + nums[n - 1] < 0)
                continue;
            while (l < r) {
                int sum = nums[l] + nums[r];
                if (sum > target) {
                    r--;
                } else if (sum < target) {
                    l++;
                } else {
                    List<Integer> t = new ArrayList<>();
                    t.add(nums[i]);
                    t.add(nums[l]);
                    t.add(nums[r]);
                    ans.add(t);
                    for (l++; l < r && nums[l] == nums[l - 1]; l++)
                        ;
                    for (r--; l < r && nums[r] == nums[r + 1]; r--)
                        ;
                }
            }
        }
        return ans;
    }
}

基于 MIT 许可发布