欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

三数之和

程序员文章站 2022-07-14 08:06:12
...

三数之和

一开始用的递归做的,然后,,,,,,超时了????

好吧,看了提示,说是双指针,那就做一下????,晚上宿舍聚餐去喽!!!

import java.util.*;

class Solution{

    List<List<Integer>> res = new LinkedList<>();
    Set<LinkedList<Integer>> set = new HashSet<>();
    public List<List<Integer>> threeSum(int[] nums) {

        // 不满足要求,直接返回
        if(nums.length <= 2){
            return res;
        }

        // 先排序
        Arrays.sort(nums);

        // 两个指针,初始化
        int i = 1;
        int j = nums.length-1;

        List<Integer> ls = new LinkedList<>();

        int index = 0;
        // pre先从0开始,i、j走
        int pre = nums[index];

        while(i < j){

            while(i < j){

                // 满足条件
                if(pre + nums[i] + nums[j] == 0){
                    ls.add(pre);
                    ls.add(nums[i]);
                    ls.add(nums[j]);
                    set.add(new LinkedList<>(ls));
                    // res.add(new LinkedList<>(ls));
                    ls.clear();
                    // pre = nums[i];
                    i++;
                    j--;
                    continue;
                }

                // 走位
                if(pre + nums[i] + nums[j] < 0){
                    i++;
                    continue;
                }

                // 走位
                if(pre + nums[i] + nums[j] > 0){
                    j--;
                }
            }
            // pre去下一个,i、j走
            index += 1;
            pre = nums[index];
            // i、j初始化
            i = index + 1;
            j = nums.length - 1;
        }


        for(List<Integer> lls: set){
           res.add(lls);
        }

        return res;
    }

    public static void main(String[] args) {
        Solution s = new Solution();
        int nums[] = new int[]{-2,-1,0,1,2,3};
        s.threeSum(nums);
    }
}