3Sum

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

Note:
  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • The solution set must not contain duplicate triplets.
    For example, given array S = {-1 0 1 2 -1 -4},

    A solution set is:
    (-1, 0, 1)
    (-1, -1, 2)


题意:给定一个数组,要求取出一个三元组,要求三元组之和为零,且三元组不重复(三个数相同视为重复)

思路:要求去重,所以先排序,然后进行三次循环用于暴力寻找。由于不能是同一个元素重复三次,所以下一个循环的起点是上一个循环的值加一。在每一次循环时去重,由于经过排序,所以相同的数已经排在一起,那么除了第一次出现之外,后面遇到这个数则跳过计算。最后将得到的数字从小到大排序并添加到list中。

实现:

public class Solution {
     public List<List<Integer>> threeSum( int[] num ) {
        List<List<Integer>> list= new LinkedList<List<Integer>>();
        Arrays. sort(num);//对num排序
        for(int i =0;i <num .length ;i ++){
           if(i >0&&num[i]==num[i-1])//去重,如果排序好的数组前后两个数字是相等的,那么之前肯定已经计算过这个数字了,本次跳过
               continue;
           for(int j =i +1;j <num .length ;j ++){
               if(j >i +1&&num[j]==num[j-1])//去重,同上
                    continue;
               for(int k =j +1;k <num .length ;k ++){
                    if(k >j +1&&num[k]==num[k-1])//去重,同上
                         continue;
                    if(num [i ]+num [j ]+num [k ]==0){

                         int l1 =num [i ];
                    int l2 =num [j ];
                    int l3 =num [k ];
                   List<Integer> ll= new LinkedList<Integer>();
                    if(l1 <l2 ){
                              ll.add( l1);
                              ll.add( l2);
                              if(l3 <l1 )
                                   ll.add(0, l3);
                              else if (l3 >l1 &&l3<l2)
                                   ll.add(1, l3);
                              else
                                   ll.add( l3);
                        } else{
                              ll.add( l2);
                              ll.add( l1);
                              if(l3 <l2 )
                                   ll.add(0, l3);
                              else if (l3 >l2 &&l3<l1)
                                   ll.add(1, l3);
                              else
                                   ll.add( l3);
                        }
                    list.add( ll);
                   }
              }
          }
        }
        return list ;
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值