【leetcode】15.三数之和

本文详细解析了经典的三数之和算法,通过数组排序和双指针技巧,有效地找到数组中三个数相加等于0的所有组合。文章深入讨论了算法的时间复杂度,并介绍了Java中的数组排序和列表转换语法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

思路:数组遍历,双指针

首先对数组进行排序,排序后固定一个数 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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值