File tree 1 file changed +34
-33
lines changed
scripts/algorithms/0-9/4Sum
1 file changed +34
-33
lines changed Original file line number Diff line number Diff line change
1
+ // Runtime: 259 ms (Top 22.83%) | Memory: 13.2 MB (Top 82.16%)
1
2
class Solution {
2
3
public:
3
4
vector<vector<int >> fourSum (vector<int >& nums, int target) {
4
-
5
+
5
6
int n = nums.size ();
6
-
7
+
7
8
vector<vector<int > > answer;
8
-
9
+
9
10
if (n<4 ) return answer;
10
-
11
+
11
12
sort (nums.begin (),nums.end ());
12
-
13
+
13
14
for (int i=0 ;i<n;){
14
15
for (int j=i+1 ;j<n;){
15
-
16
+
16
17
int left = j+1 ;
17
18
int right = n-1 ;
18
-
19
+
19
20
long long int x = (long long int )target - (long long int )nums[i] - (long long int )nums[j];
20
-
21
+
21
22
while (left<right){
22
-
23
+
23
24
if (x == nums[left]+nums[right]){
24
25
vector<int > vect{nums[i] , nums[j] , nums[left] , nums[right]};
25
26
answer.push_back (vect);
26
-
27
+
27
28
// skipping duplicates while moving right
28
29
int k = 1 ;
29
30
while ((left+k)<n && nums[left+k]==nums[left]) ++k;
30
-
31
+
31
32
if ((left+k)>=n) break ;
32
33
else left = left+k;
33
-
34
+
34
35
// skipping duplicates while moving left
35
36
k = 1 ;
36
37
while ((right-k)>=0 && nums[right-k]==nums[right]) ++k;
37
-
38
+
38
39
if ((right-k)<0 ) break ;
39
40
else right = right-k;
40
-
41
+
41
42
}
42
43
else {
43
-
44
+
44
45
if (x>nums[left]+nums[right]){
45
-
46
+
46
47
// skipping duplicates while moving right
47
48
int k = 1 ;
48
49
while ((left+k)<n && nums[left+k]==nums[left]) ++k;
49
-
50
+
50
51
if ((left+k)>=n) break ;
51
52
else left = left+k;
52
-
53
+
53
54
}
54
55
else {
55
-
56
+
56
57
// skipping duplicates while moving left
57
58
int k = 1 ;
58
59
while ((right-k)>=0 && nums[right-k]==nums[right]) ++k;
59
-
60
+
60
61
if ((right-k)<0 ) break ;
61
62
else right = right-k;
62
-
63
+
63
64
}
64
-
65
- }
66
-
65
+
67
66
}
68
-
67
+
68
+ }
69
+
69
70
// skipping duplicates while moving right
70
71
int k = 1 ;
71
72
while ((j+k)<n && nums[j+k]==nums[j]) ++k;
72
-
73
+
73
74
if ((j+k)>=n) break ;
74
- else j = j+k;
75
-
75
+ else j = j+k;
76
+
76
77
}
77
-
78
+
78
79
// skipping duplicates while moving right
79
80
int k = 1 ;
80
81
while ((i+k)<n && nums[i+k]==nums[i]) ++k;
81
-
82
+
82
83
if ((i+k)>=n) break ;
83
- else i = i+k;
84
+ else i = i+k;
84
85
}
85
-
86
+
86
87
return answer;
87
88
}
88
- };
89
+ };
You can’t perform that action at this time.
0 commit comments