@@ -2,7 +2,7 @@ Original link: [leetcoder.net - LeetCoder: Fucking Good LeetCode Solutions](http
22
33#15. 3Sum - LeetCoder: Fucking Good LeetCode Solutions
44
5- LeetCode link:[ 15. 3Sum] ( https://leetcode.com/problems/3sum ) ,Difficulty :** Medium** .
5+ LeetCode link:[ 15. 3Sum] ( https://leetcode.com/problems/3sum ) ,difficulty :** Medium** .
66
77##LeetCode description of "15. 3Sum"
88
@@ -140,6 +140,308 @@ class Solution:
140140 return list(results)
141141` ` `
142142
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+
143445## Other languages
144446
145447` ` ` java