LeetCode 15.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]
]

这一题算作不是很难的题目,但还是有一些坑需要我们注意。我一开始想的很简单,用3个for循环来做,后来调试的时候才发现这样,总是会将重复的组add到list中去,这里附上我的错误代码。

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list=new LinkedList<>();
        Arrays.sort(nums);//一种优化快排 n*logn
        int n=nums.length;
        for(int i=0;i<n-2;i++){
            for(int j=i+1;j<n-1;j++){
                for(int k=j+1;k<n;k++){
                   if(nums[i]>=0)
                        break;
                    if(nums[i]+nums[j]+nums[k]==0){
                        if(!list.contains(Arrays.asList(nums[i],nums[j],nums[k])));//无法解决问题
                            list.add(Arrays.asList(nums[i],nums[j],nums[k]));
                    }
                }
            }
        }
        return list;
    }
}

我一开始想用list中自带的contains来解决重复问题,但是事实证明我总是把事情想得太简单,contains只能解决地址相同且属性相同的问题,对于属性相同但是地址不同是无法判断出来的。没办法,这样只能每一步都要先来判断nums[i],nums[j],nums[k]是否会和前面重复出现相同的数,如果出现相同的数就用continue来跳过好了。

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list=new LinkedList<>();
        Arrays.sort(nums);//一种优化快排 n*logn
        int n=nums.length;
        for(int i=0;i<n-2;i++){
            
            if(i>0&&nums[i]==nums[i-1]) //跳过重复的部分
                continue;
            int j=i+1,k=n-1;
            int tag=-nums[i];
            while(j<k){
                if(nums[j]+nums[k]==tag){
                    list.add(Arrays.asList(nums[i],nums[j],nums[k]));
                    j++;
                    k--;
                    while(j<k&&nums[j]==nums[j-1]) j++;
                    while(j<k&&nums[k]==nums[k+1]) k--;
                }
                else if(nums[j]+nums[k]<tag){
                    j++;
                }
                else
                    k--;
            }
        }
        return list;
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值