【剑指 Offer II】 007. 数组中和为 0 的三个数

题目:
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a ,b ,c ,使得 a + b + c = 0 ?请找出所有和为 0 且 不重复 的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

示例 2:

输入:nums = []
输出:[]

示例 3:

输入:nums = [0]
输出:[]

提示:

0 <= nums.length <= 3000
-105 <= nums[i] <= 105

答案:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
    //排序后从开头开始,每个数字都有l和r表示从该数字的最左和最右,相当于l+r = -nums[i];
        Arrays.sort(nums);
        int n = nums.length;
        List<List<Integer>> list = new ArrayList<>();
        for(int i = 0; i < n - 2; i++){
            if(i != 0 && nums[i] == nums[i - 1]) continue;
            int target = -nums[i];
            int l = i + 1, r = n - 1;
            while(l < r){
                if(nums[l] + nums[r] == target){
                    list.add(Arrays.asList(nums[i], nums[l], nums[r]));
                    int tmp = nums[l];
                    do l++;
                    while(l < r && nums[l] == nums[l - 1]);//将左边指针前进到不重复的
                    do r--;
                    while(l < r && nums[r] == nums[r + 1]);//将右边指针后退到不重复的
                }else if(nums[l] + nums[r] > target) r--;
                else if(nums[l] + nums[r] < target) l++;
            }
        }
        return list;
    }
}
上一篇:007—内部类知识详解总结


下一篇:设置eclipse tab为4个空格