3sum

直接上代码

import java.util.*;

/**
 * Created by lvhao on 2017/6/27.
 */
/**
 *
 * k sum问题最后都是转化为2sum问题,2sum问题的解法:排序之后双指针。
 * 3sum:排序后先取出一个数,然后剩下的数为2sum问题,依次取完所有数,注意在取一个数时,它前边得数不用参与
 * 2sum,因为会造成重复。例如a,b,c,d,e当取到c时,进行2sum时左指针一开始就是d,不用再考虑ab,因为之前已经计算过了。
 * 同样的K sum可以逐渐转化为2sum
 * 时间复杂度:2sum:O(NlogN),3sum:O(N^2),4sum:O(N^3).....
 */

public class Q15_3sum {
    public static void main(String[] args) {
        int[] nums = new int[]{-4,-2,1,-5,-4,-4,4,-2,0,4,0,-2,3,1,-5,0};
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        for (int i = 0; i < nums.length-2; i++) {
            int num = nums[i];
            if(i != 0 && nums[i] == nums[i-1]  )
                continue;
            int l = i+1,r = nums.length-1,sum;
            while(l < r)
            {
                sum = nums[l] + nums[r];
                if(sum == -num)
                {
                    res.add(Arrays.asList(num,nums[l],nums[r]));
                    while(l<r && nums[l] == nums[l+1]) l++;
                    while(l<r && nums[r] == nums[r-1]) r--;
                    l++;
                    r--;
                }
                else if(sum > -num)
                    r--;
                else
                    l++;

            }


        }
        System.out.println(res);
}

}

 

posted @ 2017-06-27 16:43  stAr_1  阅读(290)  评论(0编辑  收藏  举报