LeetCode(015)-3Sum

题目:

Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

The solution set must not contain duplicate triplets.

Example:

Given array nums = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]

翻译:

给定一个包含n个整数的数组,在数组中是否存在a、b、c元素使得a + b + c = 0?找出数组中所有唯一的三胞胎,它们的和为零。
注意:
解决方案集不能包含重复的三元组。
例子:
给定数组编号= [-1,0,1,2,-1,-4],
解集为:
(
[1,0,1],
(1,1,2)
]

思路: 将求三数之和可以转换为求两数之和,首先对数组进行排序,然后固定一个数从头开始遍历,其它两个数一个为固定数的下一位,一个为数组最后一位, 当三数之和大于0说明右边的数较大,小于0说明左边的数较小; 需要注意的是,要去除重复数字;

代码实现:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
      List<List<Integer>> list = new ArrayList<>();
        Arrays.sort(nums);
        if(nums.length < 3 || nums[0]>0 || nums[nums.length-1] < 0 )
            return list;
        for(int i =0 ;i<nums.length-2 ;i++){
            if(i>0&&nums[i-1]==nums[i]) //必须要略过0, {-1,-1,2} 否则这种类型的会遗忘
                continue;
            int n= 0-nums[i];
            int l=i+1;
            int r=nums.length-1;
            while(l<r){
                if(n<nums[l]+nums[r]){
                    r--;
                }else if(n>nums[l]+nums[r]){ 
                    l++;
                }else{
                    list.add(Arrays.asList(nums[i],nums[l],nums[r])); 
                    //可变参数列表转换成集合
                    l++;
                    r--;
                   while(l<r&&nums[l]==nums[l-1]) //跳过相同的元素
                       l++;
                   while(l<r&&nums[r]==nums[r+1])
                       r--;
                }
                
            }     
        }
       return list;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值