[LeetCode][JavaScript]3Sum
3Sum
Given an array S of n integers, are there elements a, b, c 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 };