三数之和等于0问题优化

前面我们已经给出过三数之和等于0的代码,不过改代码在LeetCode上面超出时间限制,所以说,不能完全说解出该题,今天我们给出优解,

直接上代码:

思路:先对数组进行排序,用for循环控制一个变量i,另外两个j和k分别指向结尾和当前i的下一个位置,进行查找。

    public List<List<Integer>> threeSum(int[] nums) {
       Arrays.sort(nums);
        List<List<Integer>> lists = new ArrayList<List<Integer>>();
        if(nums.length > 2&& nums != null) {
            for(int i = 0; i < nums.length -2&& nums[i]<=0; ) {//第一个值不可能大于零
                int j = i+1;
                int k = nums.length - 1;
                while(j < k  &&nums[k] >= 0) {
                    if(nums[i] + nums[j] + nums[k] == 0) {
                        List<Integer> list = new ArrayList<>();
                        list.add(nums[i]);
                        list.add(nums[j]);
                        list.add(nums[k]);
                        lists.add(list);
                        j++;
                        k--;
                        while(j < k && nums[j-1] == nums[j]) {//从左到右找到和上一个不同的值
                            j++;
                        }
                        while(j < k && nums[k] == nums[k+1]) {//从右到左找到和上一个不同的值
                            k--;
                        }
                    }else if(nums[i] + nums[j] + nums[k] > 0) {
                        k--;
                        while(j < k && nums[k] == nums[k+1]) {
                            k--;
                        }
                    }else {
                        j++;
                        while(j < k && nums[j] == nums[j-1]) {
                            j++;
                        }
                    }
                }
                i++;       //下标累加
                while(i < nums.length -2 && nums[i] == nums[i-1]) {//找到和之前不同的下一个值
                    i++;
                }
            }
        }
        
        return lists;
 }
原文地址:https://www.cnblogs.com/du001011/p/10507806.html