15. 3Sum

题目描述:

Given an array S of n integers, are there elements a, b, c in S 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.

For example, given array S = [-1, 0, 1, 2, -1, -4],

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

题目翻译

一个包含n个整数的数组S,判断S中是否存在元素a + b + c = 0,查找数组中所有和为零的三元组。

注意:解决方案集不能包含重复的三元组。

例如,数组S = [-1,0,1,2,-1,-4]

答案是:
[
  [-1 , 0 , 1],
  [-1 , -1 , 2]
]

解题方案

标签: Array

思路:

  • 首先对数组进行排序,时间复杂度为O(n*logn)
  • 然后对数组进行两层的遍历,先取出当前遍历的数字为nums[i],然后从数组两侧取出数字分别为nums[begin]和nums[end],然后三个数求和值为sum
  • sum == 0,将三个数加入结果之中,同时将两侧的下标向中间移动,直到不与之前取出的数字相同,避免出现重复的三元组
  • sum > 0,因为数组有序,说明右侧的数字过大,所以下标左移,故而执行end--
  • sum < 0,因为数组有序,说明左侧的数字过小,所以下标右移,所以执行begin++
  • 因为两层的遍历时间复杂度为O(n^2),O(n*logn) + O(n^2) = O(n^2),所以总体时间复杂度为O(n^2)

代码:

public class Solution {  
    public List<List<Integer>> threeSum(int[] nums) {  
        List<List<Integer>> res = new ArrayList<List<Integer>>();  
        int len=nums.length;  
        if(len<3)return res;  
        Arrays.sort(nums);  
        for(int i=0;i<len;i++){  
            if(nums[i]>0)break;  
            if(i>0 && nums[i]==nums[i-1])continue;  
            int begin=i+1,end=len-1;  
            while(begin<end){  
                int sum=nums[i]+nums[begin]+nums[end];  
                if(sum==0){  
                    List<Integer> list = new ArrayList<Integer>();  
                    list.add(nums[i]);list.add(nums[begin]);list.add(nums[end]);  
                    res.add(list);  
                    begin++;end--;  
                    while(begin<end && nums[begin]==nums[begin-1])begin++;  
                    while(begin<end && nums[end]==nums[end+1])end--;  
                }else if(sum>0)end--;  
                else begin++;  
            }  
        }  
        return res;  
    }  
}

参考资料

http://blog.csdn.net/runningtortoises/article/details/45604601

results matching ""

    No results matching ""