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

【leetcode】15.三数之和

程序员文章站 2022-07-15 11:17:06
...

【leetcode】15.三数之和

思路:数组遍历,双指针

首先对数组进行排序,排序后固定一个数 nums[i],再使用左右指针指向 nums[i]后面的两端,数字分别为 nums[L] 和 nums[R],计算三个数的和 sum 判断是否满足为 0,满足则添加进结果集
如果 nums[i] == nums[i-1],则说明该数字重复,会导致结果重复,所以应该跳过
当 sum == 0 时,nums[L] == nums[L+1] 则会导致结果重复,应该跳过,L++
当 sum == 0 时,nums[R] == nums[R-1]则会导致结果重复,应该跳过,R–
时间复杂度:O(n^2)

新学的java语法:

数组排序:Arrays.sort(nums);
把数转成list:Arrays.asList(nums[i], nums[j], nums[k]);

    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        if(nums == null || nums.length<3)
            return res;
        Arrays.sort(nums);
        for(int i=0;i<nums.length-2;i++){
            int j = i+1;
            int k = nums.length-1;
            while (j<k){
                int sum = nums[i] + nums[j] + nums[k];
                if(sum == 0){
                    res.add(Arrays.asList(nums[i], nums[j], nums[k]));
                    while (j<k && nums[j+1] == nums[j]) //去重
                        j++;
                    while (j<k && nums[k-1] == nums[k]) //去重
                        k--;
                    j++;
                    k--;
                }
                else if(sum > 0)
                    k--;
                else if(sum < 0)
                    j++;
            }
            while (i<nums.length-1 && nums[i+1] == nums[i]) //去重
                i++;
        }
        return res;
    }
相关标签: leetcode