zoukankan      html  css  js  c++  java
  • 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);
    }
    
    }
  • 相关阅读:
    day 22 反射,双下方法
    day 21 封装,多态,类的其他属性
    day 20 类与类之间的关系,继承2
    day 19 类的名称空间,组合,派生
    day 18 类,对象
    day 17 re模块
    注意NULL
    SQL_DISTINCT
    重载赋值运算符
    随机序列问题
  • 原文地址:https://www.cnblogs.com/stAr-1/p/7085986.html
Copyright © 2011-2022 走看看