1
+ /**
2
+ * @param {number[] } nums
3
+ * @param {number } target
4
+ * @return {number[][] }
5
+ */
6
+ var fourSum = function ( nums , target ) {
7
+ let result = [ ] ;
8
+ nums = nums . sort ( ( a , b ) => {
9
+ return a - b ;
10
+ } )
11
+
12
+ function findThreeSum ( nums , target ) {
13
+ let dict = { }
14
+ let result = [ ] ;
15
+ for ( let i = 0 ; i < nums . length ; i ++ ) {
16
+ if ( i >= 0 && nums [ i ] === nums [ i - 1 ] ) {
17
+ continue
18
+ }
19
+ let l_pointer = i + 1 ;
20
+ let r_pointer = nums . length - 1 ;
21
+ while ( l_pointer < r_pointer ) {
22
+ if ( nums [ i ] + nums [ l_pointer ] + nums [ r_pointer ] === target ) {
23
+ let tmp = [ nums [ i ] , nums [ l_pointer ] , nums [ r_pointer ] ]
24
+ result . push ( tmp )
25
+ l_pointer ++ ;
26
+ while ( l_pointer < r_pointer && nums [ l_pointer ] === nums [ l_pointer - 1 ] ) {
27
+ l_pointer ++
28
+ }
29
+ } else if ( nums [ i ] + nums [ l_pointer ] + nums [ r_pointer ] < target ) {
30
+ l_pointer ++
31
+ }
32
+ if ( nums [ i ] + nums [ l_pointer ] + nums [ r_pointer ] > target ) {
33
+ r_pointer -- ;
34
+ }
35
+
36
+ }
37
+ }
38
+ return result
39
+ }
40
+
41
+ for ( let i = 0 ; i < nums . length ; i ++ ) {
42
+ if ( nums [ i ] === nums [ i - 1 ] ) {
43
+ continue
44
+ }
45
+ let find_three = findThreeSum ( nums . slice ( i + 1 ) , target - nums [ i ] )
46
+ if ( find_three . length > 0 ) {
47
+ for ( let j = 0 ; j < find_three . length ; j ++ ) {
48
+ result . push ( [ nums [ i ] ] . concat ( find_three [ j ] ) )
49
+ }
50
+ }
51
+ }
52
+ return result ;
53
+ } ;
0 commit comments