-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy path15.zy445566.js
60 lines (60 loc) · 1.78 KB
/
15.zy445566.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
let threeSumList = [];
let threeSumListMap = {};
function beatRepeat(num1,num2,num3) {
let res = [num1,num2,num3];
let threeStr = res.join();
if (!threeSumListMap[threeStr]) {
threeSumListMap[threeStr] = true;
threeSumList.push(res)
}
}
nums.sort((a,b)=>{return a-b;});
if (nums[0]==0 && nums[nums.length-1]==0) {
if (nums.length>=3) {
return [[0,0,0]]
} else {
return [];
}
}
for (let i=0;i<nums.length,nums[i]<=0;i++) {
if (i>0) {while(nums[i]==nums[i-1]){i++;}}
for (let j=nums.length-1;j>i+1;j--) {
if ((nums[i]+nums[j-1]+nums[j])<0){break;}
let incj = j-i;
while (nums[j]+2*nums[i]>0) {
j--;
let zj = j-Math.floor(incj/2);
if (nums[zj]+2*nums[i]>0) {
j=zj;
}
incj = incj/2;
if (j<=i+1) {break;}
}
if (j<=i+1) {break;}
for (let k=j-1;k>i;k--) {
let inc = k-i;
while (nums[i]+nums[k]+nums[j]>0) {
k--;
let zk = k-Math.floor(inc/2);
if (nums[i]+nums[zk]+nums[j]>0) {
k=zk;
}
inc = inc/2;
if (k<=i) {break;}
}
if (k<=i) {break;}
let sumRes = nums[i]+nums[k]+nums[j];
if (sumRes<0){break;}
if (sumRes==0) {
beatRepeat(nums[i],nums[k],nums[j])
}
}
}
}
return threeSumList;
};