15. 三数之和

剑指 Offer II 007. 数组中和为 0 的三个数open in new window

Approach 1,排序+双指针

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> ans = new ArrayList<>();
        Arrays.sort(nums);
        int n = nums.length;
        for (int i = 0; i < n; i++) {
            if (i != 0 && nums[i] == nums[i - 1]) continue;
            int t = -nums[i];
            for (int j = i + 1, k = n - 1; j < k; ) {
                if (j != i + 1 && nums[j] == nums[j - 1]) {
                    j++;
                    continue;
                }
                if (k != n - 1 && nums[k] == nums[k + 1]) {
                    k--;
                    continue;
                }
                int sum = nums[j] + nums[k];
                if (sum > t) {
                    k--;
                } else if (sum < t) {
                    j++;
                } else {
                    ans.add(Arrays.asList(nums[i], nums[j], nums[k]));
                    j++;
                    k--;
                }
            }
        }
        return ans;
    }
}
Last Updated:
Contributors: jesse