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;
    }
}

你可能感兴趣的:(数据结构与算法)