LeetCode 3Sum

原题链接在这里:https://leetcode.com/problems/3sum/

Two Sum是这道题的子问题,但是对于3Sum来说又不方便用HashMap,因为不方便存入相同的key,e.g -1,-1,2.

 

这道题需要先进行排序.

对于0 到 length-3 的每一个数nums[i]后面生成两个指针 j, k.

j 指向当前元素的下一元素 j = i+1; k指向最后一个元素k = nums.length-1.

判断三个数的和 nums[i] + nums[j] + nums[k] 是否是target,若比target小,j 指针后移; 若比target大, k指针前移。

 

Note:1. for loop 是注意时候会有溢出,因为会用到至少后面两个数,所以终止条件应该是 i<nums.length - 2;

2. res 中不恩能够有duplicates, 所依若是nums[i] == nums[i-1], 直接continue.

3. 最后一个else 中记得加入 j++;k--; 否则就是infinite loop, 并且注意j++;k--时是否会遇到相同元素,遇到需跳过。

否则会加入重复的结果,e.g. -2, 0, 0, 2 会加两个 -2,0,2 的 subList.

Time Complexity: O(n^2) 因为对于每一个i 后面while loop用了n的时间.

Space: O(3*res.size()).

AC  Java:

 

 1 public class Solution {
 2     public List<List<Integer>> threeSum(int[] nums) {
 3         List<List<Integer>> res = new ArrayList<List<Integer>>();
 4         if(nums == null || nums.length < 3){
 5             return res;
 6         }
 7         
 8         Arrays.sort(nums);
 9         for(int i = 0; i<nums.length-2; i++){
10             if(i>0 && nums[i] == nums[i-1]){
11                 continue;
12             }
13             
14             int j = i+1;
15             int k = nums.length-1;
16             while(j<k){
17                 if(nums[i] + nums[j] + nums[k] < 0){
18                     j++;
19                 }else if(nums[i] + nums[j] + nums[k] > 0){
20                     k--;
21                 }else{
22                     List<Integer> item = new ArrayList<Integer>();
23                     item.add(nums[i]);
24                     item.add(nums[j]);
25                     item.add(nums[k]);
26                     res.add(item);
27                     j++;
28                     k--;
29                     
30                     while(j<k && nums[j] == nums[j-1]){
31                         j++;
32                     }
33                     while(j<k && nums[k] == nums[k+1]){
34                         k--;
35                     }
36                 }
37             }
38         }
39         return res;
40     }
41 }

 

你可能感兴趣的:(LeetCode 3Sum)