15.三数之和

题目描述

在这里插入图片描述

解题思路

用两个循环,时间复杂度为n的平方
最关键的问题是去重
首先对数组进行排序,排序后固定一个数 nums[i]nums[i],再使用左右指针指向 nums[i]nums[i]后面的两端,数字分别为 nums[L]nums[L] 和 nums[R]nums[R],计算三个数的和 sumsum 判断是否满足为 00,满足则添加进结果集
如果 nums[i]nums[i]大于 00,则三数之和必然无法等于 00,结束循环
如果 nums[i]nums[i] == nums[i-1]nums[i−1],则说明该数字重复,会导致结果重复,所以应该跳过
当 sumsum == 00 时,nums[L]nums[L] == nums[L+1]nums[L+1] 则会导致结果重复,应该跳过,L++L++
当 sumsum == 00 时,nums[R]nums[R] == nums[R-1]nums[R−1] 则会导致结果重复,应该跳过,R–R−−

作者:guanpengchn
链接:https://leetcode-cn.com/problems/3sum/solution/hua-jie-suan-fa-15-san-shu-zhi-he-by-guanpengchn/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

代码

下面展示一些 内联代码片


class Solution {
    public List<List<Integer>> threeSum(int[] nums) {

        int length=nums.length;
        List<List<Integer>> ans = new ArrayList();

        if(length<3)
            return ans;
        int i=0,left,right;
        Arrays.sort(nums);
        while (i<=length-3)
        {


            if(nums[i]>0)
                break;
            left=i+1;
            right=length-1;
            while(left<right)
            {
                if(nums[i]+nums[left]+nums[right]==0)
                {
                    List<Integer>ls=new ArrayList<>();
                    ls.add(nums[i]);
                    ls.add(nums[left]);
                    ls.add(nums[right]);
                    ans.add(ls);
                    left++;
                    while (nums[left-1]==nums[left]&&left<right)
                        left++;
                    right--;
                    while (nums[right+1]==nums[right]&&left<right)
                        right--;
                }
                else if(nums[i]+nums[left]+nums[right]<0)
                {
                    left++;
                    while (nums[left-1]==nums[left]&&left<right)
                        left++;
                }
                else if(nums[i]+nums[left]+nums[right]>0)
                {
                    right--;
                    while (nums[right+1]==nums[right]&&left<right)
                        right--;
                }
            }
            i++;
            while( nums[i] == nums[i-1]&&i<=length-3) i++;
        }
        return ans;


    }


    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值