数字和 - LC15 3sum

2017-11-08  本文已影响0人  风烨

先排序,用三个指针,时间复杂度为O(n2)

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        for(int i = 0; i< nums.length-2; i++){
            if (nums[i] > 0) return res;// positive cannot be zero
            if (i > 0 && nums[i] == nums[i - 1]) continue;// skip same value
            for(int j = i + 1, k = nums.length - 1; j < k;){ // j for nearst value, k for biggest value
                int sum = Math.negateExact(nums[i]); // this method only for int or long
                if (nums[j] + nums[k] == sum) {
                     //adding value and moveing pointer k and j
                    res.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[j++], nums[k--])));
                    while (j < k && nums[j] == nums[j - 1]) j++;// skip same value
                    while (j < k && nums[k] == nums[k + 1]) k--;// skip same value
                } else if ( nums[j] + nums[k] > sum)  --k; // find smaller value from k
                else ++j; // find bigger value from j
            }
        }
  
        return res;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读