p15,三数之和,双指针法,java版

public static List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);/*对数组进行排序*/
        List<List<Integer>> lists = new ArrayList<>();
        for (int i = 0; i < nums.length - 2; i++) {/*遍历数组作为第一个数*/
            if (nums[i] > 0) break;  /*第一个数大于 0,后面的数都比它大,肯定不成立了*/
            if (i > 0 && nums[i] == nums[i - 1]) continue;/*排除重复遍历同一个数情况*/
            int left = i + 1;/*定义左指针*/
            int right = nums.length - 1;/*定义右指针*/
            while (left < right) {
                if (nums[i] + nums[left] + nums[right] > 0) {/*如果和大于0,说明右指针应该左移*/
                    right--;
                } else if (nums[i] + nums[left] + nums[right] < 0) {/*如果和小于0,说明左指针应该右移*/
                    left++;
                }
                if (nums[i] + nums[left] + nums[right] == 0 && left != right) {/*如果和等于0,且左右指针不相等,存入数组*/
                    List<Integer> arr = new ArrayList<>();
                    arr.add(nums[i]);
                    arr.add(nums[left]);
                    arr.add(nums[right]);
                    if (!lists.contains(arr)) {/*如果是不重复的集合,则添加*/
                        lists.add(arr);
                    }
                    left++;/*必须移动左或右指针,否则跳不出循环,而且同一i可能存在两个符合要求的集合*/
                }
            }
        }
        return lists;
    }

 

posted @ 2022-05-14 21:01  学习没什么用  阅读(20)  评论(0)    收藏  举报