码迷,mamicode.com
首页 > 其他好文 > 详细

3sum

时间:2017-06-27 16:59:39      阅读:474      评论:0      收藏:0      [点我收藏+]

标签:.so   rgs   tin   时间复杂度   class   arraylist   system   复杂   stat   

直接上代码

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

}

 

3sum

标签:.so   rgs   tin   时间复杂度   class   arraylist   system   复杂   stat   

原文地址:http://www.cnblogs.com/stAr-1/p/7085986.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!