[LeetCode][JavaScript]3Sum

3Sum

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

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • The solution set must not contain duplicate triplets.
    For example, given array S = {-1 0 1 2 -1 -4},

    A solution set is:
    (-1, 0, 1)
    (-1, -1, 2)

https://leetcode.com/problems/3sum/

 

 


 

 

 

一开始就想到暴力三重循环,提示说双指针。

先要排序,这题的解法很依赖顺序。

外层循环从头到尾,内层用双指针。

内层每一轮将两指针指向的值和外层循环的值相加,如果相等说明找到了;如果小于0,头指针往后走;大于0尾指针往前。

可以这样做就是基于已经排过序了。

 1 /**
 2  * @param {number[]} nums
 3  * @return {number[][]}
 4  */
 5 var threeSum = function(nums) {
 6     var res = [];
 7     nums = nums.sort(sorting);
 8 
 9     for(var i = 0; i < nums.length - 2; i++){
10         if(nums[i - 1] !== undefined && nums[i - 1] === nums[i]){
11             continue;
12         }
13         var curr = nums[i];
14         var m = i + 1;
15         var n = nums.length - 1;
16         while(m < n){
17             if(nums[m] + nums[n] + curr === 0){
18                 res.push([curr, nums[m], nums[n]]);
19                 while(m < n && nums[m] === nums[m + 1]){
20                     m++;
21                 }
22                 while(m < n && nums[n] === nums[n - 1]){
23                     n--;
24                 }
25                 m++; n--; 
26             } else if(nums[m] + nums[n] + curr > 0){
27                 n--;
28             } else {
29                 m++;
30             }
31         }
32     }
33     return res;
34 
35     function sorting(a, b){
36         if(a > b){
37             return 1;
38         }else if(a < b){
39             return -1;
40         }else{
41             return 0;
42         }
43     }
44 };

 

 

posted @ 2015-05-30 20:12  `Liok  阅读(1046)  评论(0编辑  收藏  举报