Given an array nums of n integers, are there elements abc in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

The solution set must not contain duplicate triplets.

Example:

Given array nums = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

 

题意:

给定一个数组和一个值target,找到所有三数加起来等于target的组合

 

Solution1:Two Pointers(left and right to meet each other)

1. Sort the array (coz we must check the duplicates) 

2. Lock one pointer and do two sum with the other two

 

[leetcode]15. 3Sum三数之和

Step1: Sort the given array in ascending order

Step2: Lock pointer i, then do two sum with two pointers j, k

[leetcode]15. 3Sum三数之和

 

Step3:  checking nums[i] + nums[j] + nums[k] == target ? 

           if   nums[i] + nums[j] + nums[k] < target,  pointer j ++

           if   nums[i] + nums[j] + nums[k] > target,  pointer k --

[leetcode]15. 3Sum三数之和

                       

注意几点:

1、题目要求“The solution set must not contain duplicate triplets.” 每次移动 i , j , k 都注意查重

2、Arrays工具类中常用方法需要牢记:

Arrays.sort() 排序数组

Arrays.fill() 填充数组

Arrays.toString() 将int数组转成string数组

Arrays.asList() 将数组转成list集合

 

code:

 1 /*
 2     Time Complexity: O(n^2). For each locked item, we need traverse the rest of array behind such item.  
 3     Space Complexity: O(1).  We only used constant extra space.
 4 */
 5 class Solution {
 6     public List<List<Integer>> threeSum(int[] nums) {
 7         List<List<Integer>> result = new ArrayList<>();
 8         int target = 0;
 9         Arrays.sort(nums);
10         // corner case
11         if (nums.length < 3) return result;
12 
13         for (int i = 0; i < nums.length; i++) {
14             if (i > 0 && nums[i] == nums[i - 1]) continue;   // skip duplicates
15             int j = i + 1;
16             int k = nums.length - 1;
17             while (j < k) {
18                 if (nums[i] + nums[j] + nums[k] < target) {
19                     j++;
20                     while (j < k && nums[j] == nums[j - 1]) j++; // skip duplicates
21                 } else if (nums[i] + nums[j] + nums[k] > target) {
22                     k--;
23                     while (j < k && nums[k] == nums[k + 1]) k--; // skip duplicates
24                 } else {
25                     result.add(Arrays.asList(nums[i], nums[j], nums[k]));
26                     j++;
27                     k--;
28                     while (j < k && nums[j] == nums[j - 1]) j++; // skip duplicates
29                     while (j < k && nums[k] == nums[k + 1]) k--; // skip duplicates
30                 }
31             }
32         }
33         return result;
34     }
35 }

 

 

 

 

相关文章: