@@ -2,7 +2,7 @@ Original link: [leetcoder.net - LeetCoder: Fucking Good LeetCode Solutions](http
2
2
3
3
#15. 3Sum - LeetCoder: Fucking Good LeetCode Solutions
4
4
5
- LeetCode link:[ 15. 3Sum] ( https://leetcode.com/problems/3sum ) ,Difficulty :** Medium** .
5
+ LeetCode link:[ 15. 3Sum] ( https://leetcode.com/problems/3sum ) ,difficulty :** Medium** .
6
6
7
7
##LeetCode description of "15. 3Sum"
8
8
@@ -140,6 +140,308 @@ class Solution:
140
140
return list(results)
141
141
` ` `
142
142
143
+ ## Ruby
144
+
145
+ ` ` ` ruby
146
+ # @param {Integer[]} nums
147
+ # @return {Integer[][]}
148
+ def three_sum(nums)
149
+ nums.sort!
150
+ results = Set.new
151
+
152
+ nums_2 = []
153
+ nums.each_with_index do |num, i|
154
+ next if i >= 3 && num == nums[i - 1] && num == nums[i - 2] && num == nums[i - 3]
155
+ nums_2.append(num)
156
+ end
157
+
158
+ nums = nums_2
159
+
160
+ # Iterate through each number as potential first element
161
+ (0...nums.length - 2).each do |i|
162
+ break if nums[i] > 0
163
+
164
+ left = i + 1
165
+ right = nums.length - 1
166
+
167
+ # Two-pointer approach for remaining elements
168
+ while left < right
169
+ current_sum = nums[i] + nums[left] + nums[right]
170
+ if current_sum == 0
171
+ # Add sorted triplet to avoid duplicates
172
+ results.add([nums[i], nums[left], nums[right]])
173
+ left += 1
174
+ right -= 1
175
+ elsif current_sum < 0
176
+ left += 1 # Need larger sum
177
+ else
178
+ right -= 1 # Need smaller sum
179
+ end
180
+ end
181
+ end
182
+
183
+ results.to_a
184
+ end
185
+ ` ` `
186
+
187
+ ## Go
188
+
189
+ ` ` ` go
190
+ func threeSum(nums []int) [][]int {
191
+ sort.Ints(nums)
192
+
193
+ nums2 := make([]int, 0)
194
+ for i, num := range nums {
195
+ if i >= 3 && num == nums[i-1] && nums[i-1] == nums[i-2] && nums[i-2] == nums[i-3] {
196
+ continue
197
+ }
198
+ nums2 = append(nums2, num)
199
+ }
200
+
201
+ nums = nums2
202
+ results := make([][]int, 0)
203
+ seen := make(map[string]bool)
204
+
205
+ for i := 0; i < len(nums)-2; i++ {
206
+ // if nums[i] > 0 {
207
+ // break
208
+ // }
209
+
210
+ left := i + 1
211
+ right := len(nums) - 1
212
+
213
+ for left < right {
214
+ sum := nums[left] + nums[right]
215
+ if sum == -nums[i] {
216
+ triplet := []int{nums[i], nums[left], nums[right]}
217
+ key := fmt.Sprintf("%d,%d,%d", triplet[0], triplet[1], triplet[2])
218
+ if !seen[key] {
219
+ results = append(results, triplet)
220
+ seen[key] = true
221
+ }
222
+ left++
223
+ } else if sum > -nums[i] {
224
+ right--
225
+ } else {
226
+ left++
227
+ }
228
+ }
229
+ }
230
+
231
+ return results
232
+ }
233
+ ` ` `
234
+
235
+ ##C ++
236
+
237
+ ` ` ` cpp
238
+ class Solution {
239
+ public:
240
+ vector<vector<int>> threeSum(vector<int>& nums) {
241
+ sort(nums.begin(), nums.end());
242
+
243
+ // Uncomment to speed up
244
+ // vector<int> nums2;
245
+ // for (int i = 0; i < nums.size(); i++) {
246
+ // if (i >= 3 && nums[i] == nums[i-1] && nums[i-1] == nums[i-2] &&
247
+ // nums[i-2] == nums[i-3]) {
248
+ // continue;
249
+ // }
250
+ // nums2.push_back(nums[i]);
251
+ // }
252
+ // nums = nums2;
253
+
254
+ vector<vector<int>> results;
255
+ set<vector<int>> seen;
256
+
257
+ for (int i = 0; i < nums.size() - 2; i++) {
258
+ // Uncomment to speed up
259
+ // if (nums[i] > 0) {
260
+ // break;
261
+ // }
262
+ int left = i + 1;
263
+ int right = nums.size() - 1;
264
+
265
+ while (left < right) {
266
+ int sum = nums[left] + nums[right];
267
+
268
+ if (sum == -nums[i]) {
269
+ vector<int> triplet = {nums[i], nums[left], nums[right]};
270
+
271
+ if (seen.find(triplet) == seen.end()) {
272
+ results.push_back(triplet);
273
+ seen.insert(triplet);
274
+ }
275
+
276
+ left++;
277
+ } else if (sum > -nums[i]) {
278
+ right--;
279
+ } else {
280
+ left++;
281
+ }
282
+ }
283
+ }
284
+
285
+ return results;
286
+ }
287
+ };
288
+ ` ` `
289
+
290
+ ## JavaScript
291
+
292
+ ` ` ` javascript
293
+ /**
294
+ * @param {number[]} nums
295
+ * @return {number[][]}
296
+ */
297
+ var threeSum = function(nums) {
298
+ nums.sort((a, b) => a - b);
299
+
300
+ // Uncomment to speed up
301
+ // let nums2 = [];
302
+ // for (let i = 0; i < nums.length; i++) {
303
+ // if (i >= 3 && nums[i] === nums[i-1] && nums[i-1] === nums[i-2] && nums[i-2] === nums[i-3]) {
304
+ // continue;
305
+ // }
306
+ // nums2.push(nums[i]);
307
+ // }
308
+ // nums = nums2;
309
+
310
+ const results = [];
311
+ const seen = new Set();
312
+
313
+ for (let i = 0; i < nums.length - 2; i++) {
314
+ // Uncomment to speed up
315
+ // if (nums[i] > 0) {
316
+ // break;
317
+ // }
318
+ let left = i + 1;
319
+ let right = nums.length - 1;
320
+
321
+ while (left < right) {
322
+ const sum = nums[left] + nums[right];
323
+
324
+ if (sum === -nums[i]) {
325
+ const triplet = [nums[i], nums[left], nums[right]];
326
+ const key = triplet.join(',');
327
+ if (!seen.has(key)) {
328
+ results.push(triplet);
329
+ seen.add(key);
330
+ }
331
+ left++;
332
+ } else if (sum > -nums[i]) {
333
+ right--;
334
+ } else {
335
+ left++;
336
+ }
337
+ }
338
+ }
339
+
340
+ return results;
341
+ };
342
+ ` ` `
343
+
344
+ ##C #
345
+
346
+ ` ` ` csharp
347
+ public class Solution {
348
+ public IList<IList<int>> ThreeSum(int[] nums) {
349
+ Array.Sort(nums);
350
+
351
+ // Uncomment to speed up
352
+ // var nums2 = new List<int>();
353
+ // for (int i = 0; i < nums.Length; i++) {
354
+ // if (i >= 3 && nums[i] == nums[i-1] && nums[i-1] == nums[i-2] && nums[i-2] == nums[i-3]) {
355
+ // continue;
356
+ // }
357
+ // nums2.Add(nums[i]);
358
+ // }
359
+ // nums = nums2.ToArray();
360
+
361
+ var results = new List<IList<int>>();
362
+ var seen = new HashSet<string>();
363
+
364
+ for (int i = 0; i < nums.Length - 2; i++) {
365
+ // Uncomment to speed up
366
+ // if (nums[i] > 0) {
367
+ // break;
368
+ // }
369
+ int left = i + 1;
370
+ int right = nums.Length - 1;
371
+
372
+ while (left < right) {
373
+ int sum = nums[left] + nums[right];
374
+ if (sum == -nums[i]) {
375
+ var triplet = new List<int> { nums[i], nums[left], nums[right] };
376
+ string key = string.Join(",", triplet);
377
+ if (!seen.Contains(key)) {
378
+ results.Add(triplet);
379
+ seen.Add(key);
380
+ }
381
+ left++;
382
+ } else if (sum > -nums[i]) {
383
+ right--;
384
+ } else {
385
+ left++;
386
+ }
387
+ }
388
+ }
389
+
390
+ return results;
391
+ }
392
+ }
393
+ ` ` `
394
+
395
+ ## Java
396
+
397
+ ` ` ` java
398
+ class Solution {
399
+ public List<List<Integer>> threeSum(int[] nums) {
400
+ Arrays.sort(nums);
401
+
402
+ // Uncomment to speed up
403
+ // List<Integer> nums2 = new ArrayList<>();
404
+ // for (int i = 0; i < nums.length; i++) {
405
+ // if (i >= 3 && nums[i] == nums[i-1] && nums[i-1] == nums[i-2] && nums[i-2] == nums[i-3]) {
406
+ // continue;
407
+ // }
408
+ // nums2.add(nums[i]);
409
+ // }
410
+ // nums = nums2.stream().mapToInt(i -> i).toArray();
411
+
412
+ List<List<Integer>> results = new ArrayList<>();
413
+ var seen = new HashSet<>();
414
+
415
+ for (int i = 0; i < nums.length - 2; i++) {
416
+ // Uncomment to speed up
417
+ // if (nums[i] > 0) {
418
+ // break;
419
+ // }
420
+ int left = i + 1;
421
+ int right = nums.length - 1;
422
+
423
+ while (left < right) {
424
+ int sum = nums[left] + nums[right];
425
+ if (sum == -nums[i]) {
426
+ List<Integer> triplet = Arrays.asList(nums[i], nums[left], nums[right]);
427
+ if (!seen.contains(triplet)) {
428
+ results.add(triplet);
429
+ seen.add(triplet);
430
+ }
431
+ left++;
432
+ } else if (sum > -nums[i]) {
433
+ right--;
434
+ } else {
435
+ left++;
436
+ }
437
+ }
438
+ }
439
+
440
+ return results;
441
+ }
442
+ }
443
+ ` ` `
444
+
143
445
## Other languages
144
446
145
447
` ` ` java