Leetcode15 三数之和(java实现)

Leetcode15 三数之和

题目描述
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4]
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
解题思路:
这个题目应该采用3个指针的解法,但是不应该是单纯的进行3个for循环来解决,这样复杂度肯定会超时。对于这类数组的问题,一般是先将数组进行排序(具体从大到小排序还是从小到大需要根据题目的要求具体对待)。注意这个题目要求满足条件的结果集里面本能够有重复的元素,所以在处理的过程中需要进行去重。此外,这个题目还需要掌握一个将数组转换成集合的方法,Arrays.asList。具体的参见如下代码:

class Solution{
    public List<List<Integer>> threeSum(int[] nums){
    //保存最终结果集的list
     List<List<Integer>> list=new ArrayList<>() ;
     int n=nums.length;
     //处理边界条件
     if(nums==null || n==0) return list;
     //对原始数组进行排序,默认采用从小到大的顺序
     Arrays.sort(nums);
     //排完序后,处理极端的边界条件
     if(4*nums[0]>0) return list;
     if(4*nums[n-1]<0) return list;
     for(int i=0;i<n-2;i++){
     //初始化3个指针,分别为i,j,k
         int j=i+1;
         int k=n-1;
         while(j<k){
         //找到了满足条件的解,需要加入结果集
             if(nums[i]+nums[j]==-nums[k]){
                 list.add(Arrays.asList(nums[i],nums[j],nums[k]));
                 //如果当前结果集不满足条件,遇到重复的需要去重
                 while(i<n-2 && nums[i]==nums[i+1]) i++;
                 while(j<k && nums[j]==nums[j+1]) j++;
                 while(j<k && nums[k]==nums[k-1]) k--;
                 j++;
                 k--;
             }
             else if(nums[i]+nums[j]>-nums[k]){
                 k--;
             }
             else{
                 j++;
             }
         }
     }
     return list;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值