function threeSumBrute(nums) {
const n = nums.length;
const result = [];
for (let i = 0; i < n - 2; i++) {
for (let j = i + 1; j < n - 1; j++) {
for (let k = j + 1; k < n; k++) {
if (nums[i] + nums[j] + nums[k] === 0) {
const triplet = [nums[i], nums[j], nums[k]].sort((a,b)=>a-b);
if (!result.some(r => r[0] === triplet[0] && r[1] === triplet[1] && r[2] === triplet[2])) {
result.push(triplet);
}
}
}
}
}
return result;
}
console.log(threeSumBrute([-1,0,1,2,-1,-4]));
console.log(threeSumBrute([0,0,0,0]));
console.log(threeSumBrute([1,2,-2,-1]));
// Brute-force 3Sum (LC15)
// JavaScript
// Time Complexity: O(n^3), Space Complexity: O(1) extra
// Purpose: Demonstrate correctness baseline for interviews
/**
* Brute-force implementation of 3Sum.
* Tries all triplets (i, j, k) and returns all unique triplets that sum to 0.
*
* @param {number[]} nums - input array of integers
* @returns {number[][]} - array of triplets [a,b,c] such that a+b+c=0
*/
function threeSumBrute(nums) {
const n = nums.length;
const result = [];
for (let i = 0; i < n - 2; i++) {
for (let j = i + 1; j < n - 1; j++) {
for (let k = j + 1; k < n; k++) {
if (nums[i] + nums[j] + nums[k] === 0) {
const triplet = [nums[i], nums[j], nums[k]].sort((a,b)=>a-b);
// avoid duplicates
if (!result.some(r => r[0] === triplet[0] && r[1] === triplet[1] && r[2] === triplet[2])) {
result.push(triplet);
}
}
}
}
}
return result;
}
// Example tests
console.log(threeSumBrute([-1,0,1,2,-1,-4])); // [[-1,-1,2],[-1,0,1]]
console.log(threeSumBrute([0,0,0,0])); // [[0,0,0]]
console.log(threeSumBrute([1,2,-2,-1])); // []
/*
COMMENTS — Brute Force:
- Simple, checks all triplets for sum=0.
- Demonstrates correctness for interviews.
- Duplicate elimination handled via sorting + check.
- Not efficient for large n; primarily for explanation and tiny inputs.
- Keywords in problem hints: "three numbers sum to zero", "triplet", "unique triplets".
Complexity:
- Time: O(n^3), because three nested loops.
- Space: O(1) extra (excluding result storage).
*/
function threeSumOptimized(nums) {
nums.sort((a,b)=>a-b);
const n = nums.length;
const result = [];
for (let i = 0; i < n - 2; i++) {
if (i > 0 && nums[i] === nums[i-1]) continue;
let left = i + 1;
let right = n - 1;
while (left < right) {
const sum = nums[i] + nums[left] + nums[right];
if (sum === 0) {
result.push([nums[i], nums[left], nums[right]]);
left++;
right--;
while (left < right && nums[left] === nums[left-1]) left++;
while (left < right && nums[right] === nums[right+1]) right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return result;
}
console.log(threeSumOptimized([-1,0,1,2,-1,-4]));
console.log(threeSumOptimized([0,0,0,0]));
console.log(threeSumOptimized([1,2,-2,-1]));
// Optimized 3Sum (LC15)
// JavaScript — Two pointers after sorting
// Time Complexity: O(n^2), Space Complexity: O(n) for result
// Purpose: Efficient solution suitable for interviews
/**
* Optimized 3Sum using sorting + two pointers.
*
* @param {number[]} nums
* @returns {number[][]} - array of unique triplets summing to 0
*/
function threeSumOptimized(nums) {
nums.sort((a,b)=>a-b);
const n = nums.length;
const result = [];
for (let i = 0; i < n - 2; i++) {
if (i > 0 && nums[i] === nums[i-1]) continue; // skip duplicate first element
let left = i + 1;
let right = n - 1;
while (left < right) {
const sum = nums[i] + nums[left] + nums[right];
if (sum === 0) {
result.push([nums[i], nums[left], nums[right]]);
left++;
right--;
// skip duplicates
while (left < right && nums[left] === nums[left-1]) left++;
while (left < right && nums[right] === nums[right+1]) right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return result;
}
// Example tests
console.log(threeSumOptimized([-1,0,1,2,-1,-4])); // [[-1,-1,2],[-1,0,1]]
console.log(threeSumOptimized([0,0,0,0])); // [[0,0,0]]
console.log(threeSumOptimized([1,2,-2,-1])); // []
/*
COMMENTS — Optimized:
- Uses sorting + two pointers to find triplets efficiently.
- Skip duplicates to ensure unique triplets.
- Ideal interview solution for large n.
- Keywords: "two pointers", "sorted array", "skip duplicates", "triplets sum zero".
Complexity:
- Time: O(n^2) because outer loop O(n) + inner two pointers O(n)
- Space: O(n) for result (excluding sorting in-place)
- Edge-case handling: duplicate numbers, multiple zeros.
*/
from typing import List
def three_sum_brute(nums: List[int]) -> List[List[int]]:
n = len(nums)
result = []
for i in range(n-2):
for j in range(i+1, n-1):
for k in range(j+1, n):
if nums[i] + nums[j] + nums[k] == 0:
triplet = sorted([nums[i], nums[j], nums[k]])
if triplet not in result:
result.append(triplet)
return result
print(three_sum_brute([-1,0,1,2,-1,-4]))
print(three_sum_brute([0,0,0,0]))
print(three_sum_brute([1,2,-2,-1]))
"""
COMMENTS — Brute Force:
- Simple, ensures correctness.
- Checks all triplets for sum=0.
- Removes duplicates via sorting + check.
- Use only for tiny arrays or teaching purpose.
- Complexity: O(n^3) time, O(1) extra space.
"""
# Brute-force 3Sum (LC15)
# Python
# Time Complexity: O(n^3), Space Complexity: O(1) extra
from typing import List
def three_sum_brute(nums: List[int]) -> List[List[int]]:
n = len(nums)
result = []
for i in range(n-2):
for j in range(i+1, n-1):
for k in range(j+1, n):
if nums[i] + nums[j] + nums[k] == 0:
triplet = sorted([nums[i], nums[j], nums[k]])
if triplet not in result:
result.append(triplet)
return result
# Example tests
print(three_sum_brute([-1,0,1,2,-1,-4])) # [[-1,-1,2],[-1,0,1]]
print(three_sum_brute([0,0,0,0])) # [[0,0,0]]
print(three_sum_brute([1,2,-2,-1])) # []
"""
COMMENTS — Brute Force:
- Simple, ensures correctness.
- Checks all triplets for sum=0.
- Removes duplicates via sorting + check.
- Use only for tiny arrays or teaching purpose.
- Complexity: O(n^3) time, O(1) extra space.
"""
from typing import List
def three_sum_optimized(nums: List[int]) -> List[List[int]]:
nums.sort()
n = len(nums)
result = []
for i in range(n-2):
if i > 0 and nums[i] == nums[i-1]:
continue
left, right = i+1, n-1
while left < right:
total = nums[i] + nums[left] + nums[right]
if total == 0:
result.append([nums[i], nums[left], nums[right]])
left += 1
right -= 1
while left < right and nums[left] == nums[left-1]:
left += 1
while left < right and nums[right] == nums[right+1]:
right -= 1
elif total < 0:
left += 1
else:
right -= 1
return result
print(three_sum_optimized([-1,0,1,2,-1,-4]))
print(three_sum_optimized([0,0,0,0]))
print(three_sum_optimized([1,2,-2,-1]))
"""
COMMENTS — Optimized:
- Sort + two pointers gives O(n^2) solution.
- Skip duplicates for uniqueness.
- Ideal for interview discussion.
- Keywords: two pointers, triplets, sorted array, skip duplicates.
"""
# Optimized 3Sum (LC15)
# Python — Sorting + Two Pointers
# Time Complexity: O(n^2), Space Complexity: O(n) for result
from typing import List
def three_sum_optimized(nums: List[int]) -> List[List[int]]:
nums.sort()
n = len(nums)
result = []
for i in range(n-2):
if i > 0 and nums[i] == nums[i-1]:
continue # skip duplicate first element
left, right = i+1, n-1
while left < right:
total = nums[i] + nums[left] + nums[right]
if total == 0:
result.append([nums[i], nums[left], nums[right]])
left += 1
right -= 1
# skip duplicates
while left < right and nums[left] == nums[left-1]:
left += 1
while left < right and nums[right] == nums[right+1]:
right -= 1
elif total < 0:
left += 1
else:
right -= 1
return result
# Example tests
print(three_sum_optimized([-1,0,1,2,-1,-4])) # [[-1,-1,2],[-1,0,1]]
print(three_sum_optimized([0,0,0,0])) # [[0,0,0]]
print(three_sum_optimized([1,2,-2,-1])) # []
"""
COMMENTS — Optimized:
- Sort + two pointers gives O(n^2) solution.
- Skip duplicates for uniqueness.
- Ideal for interview discussion.
- Keywords: two pointers, triplets, sorted array, skip duplicates.
"""
import java.util.*;
public class ThreeSumBrute {
public static List<List<Integer>> threeSumBrute(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
int n = nums.length;
for (int i = 0; i < n-2; i++) {
for (int j = i+1; j < n-1; j++) {
for (int k = j+1; k < n; k++) {
if (nums[i] + nums[j] + nums[k] == 0) {
List<Integer> triplet = Arrays.asList(nums[i], nums[j], nums[k]);
Collections.sort(triplet);
if (!result.contains(triplet)) {
result.add(triplet);
}
}
}
}
}
return result;
}
public static void main(String[] args) {
int[] nums1 = {-1,0,1,2,-1,-4};
int[] nums2 = {0,0,0,0};
int[] nums3 = {1,2,-2,-1};
System.out.println(threeSumBrute(nums1));
System.out.println(threeSumBrute(nums2));
System.out.println(threeSumBrute(nums3));
}
}
// Brute-force 3Sum (LC15) - Java
// Time Complexity: O(n^3), Space Complexity: O(1) extra
// Purpose: Demonstrate correctness baseline in interviews
import java.util.*;
public class ThreeSumBrute {
/**
* Brute-force 3Sum implementation
* Tries all triplets (i,j,k) and returns all unique triplets summing to 0
*
* @param nums input array of integers
* @return list of triplets [a,b,c] such that a+b+c = 0
*/
public static List<List<Integer>> threeSumBrute(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
int n = nums.length;
for (int i = 0; i < n-2; i++) {
for (int j = i+1; j < n-1; j++) {
for (int k = j+1; k < n; k++) {
if (nums[i] + nums[j] + nums[k] == 0) {
List<Integer> triplet = Arrays.asList(nums[i], nums[j], nums[k]);
Collections.sort(triplet);
if (!result.contains(triplet)) {
result.add(triplet);
}
}
}
}
}
return result;
}
// Example runner
public static void main(String[] args) {
int[] nums1 = {-1,0,1,2,-1,-4};
int[] nums2 = {0,0,0,0};
int[] nums3 = {1,2,-2,-1};
System.out.println(threeSumBrute(nums1)); // [[-1,-1,2],[-1,0,1]]
System.out.println(threeSumBrute(nums2)); // [[0,0,0]]
System.out.println(threeSumBrute(nums3)); // []
}
}
/*
COMMENTS — Brute:
- Simple and demonstrates correctness by exhaustive search.
- Eliminates duplicates by sorting + contains check.
- Interview keywords: "three numbers sum to zero", "triplet", "unique triplets".
- Time: O(n^3)
- Space: O(1) extra (excluding result storage)
- Suitable for small arrays or teaching baseline.
*/
import java.util.*;
public class ThreeSumOptimized {
public static List<List<Integer>> threeSumOptimized(int[] nums) {
Arrays.sort(nums);
int n = nums.length;
List<List<Integer>> result = new ArrayList<>();
for (int i = 0; i < n-2; i++) {
if (i > 0 && nums[i] == nums[i-1]) continue;
int left = i+1, right = n-1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
left++;
right--;
while (left < right && nums[left] == nums[left-1]) left++;
while (left < right && nums[right] == nums[right+1]) right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return result;
}
public static void main(String[] args) {
int[] nums1 = {-1,0,1,2,-1,-4};
int[] nums2 = {0,0,0,0};
int[] nums3 = {1,2,-2,-1};
System.out.println(threeSumOptimized(nums1));
System.out.println(threeSumOptimized(nums2));
System.out.println(threeSumOptimized(nums3));
}
}
// Optimized 3Sum (LC15) - Java
// Sorting + Two Pointers
// Time Complexity: O(n^2), Space Complexity: O(n) for result
// Purpose: Efficient solution suitable for interviews
import java.util.*;
public class ThreeSumOptimized {
/**
* Optimized 3Sum using sorting + two pointers
* Returns all unique triplets summing to 0
*
* @param nums input array
* @return list of triplets
*/
public static List<List<Integer>> threeSumOptimized(int[] nums) {
Arrays.sort(nums);
int n = nums.length;
List<List<Integer>> result = new ArrayList<>();
for (int i = 0; i < n-2; i++) {
if (i > 0 && nums[i] == nums[i-1]) continue; // skip duplicate first element
int left = i+1, right = n-1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
left++;
right--;
// skip duplicates
while (left < right && nums[left] == nums[left-1]) left++;
while (left < right && nums[right] == nums[right+1]) right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return result;
}
public static void main(String[] args) {
int[] nums1 = {-1,0,1,2,-1,-4};
int[] nums2 = {0,0,0,0};
int[] nums3 = {1,2,-2,-1};
System.out.println(threeSumOptimized(nums1)); // [[-1,-1,2],[-1,0,1]]
System.out.println(threeSumOptimized(nums2)); // [[0,0,0]]
System.out.println(threeSumOptimized(nums3)); // []
}
}
/*
COMMENTS — Optimized:
- Sort array and use two-pointer approach.
- Skip duplicates to ensure unique triplets.
- Efficient interview-ready solution.
- Time: O(n^2)
- Space: O(n) for result storage.
- Edge-case handling: duplicates, multiple zeros.
- Keywords: "two pointers", "sorted array", "skip duplicates", "triplets sum zero".
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<vector<int>> threeSumBrute(vector<int>& nums) {
vector<vector<int>> result;
int n = nums.size();
for (int i = 0; i < n-2; i++) {
for (int j = i+1; j < n-1; j++) {
for (int k = j+1; k < n; k++) {
if (nums[i] + nums[j] + nums[k] == 0) {
vector<int> triplet = {nums[i], nums[j], nums[k]};
sort(triplet.begin(), triplet.end());
if (find(result.begin(), result.end(), triplet) == result.end())
result.push_back(triplet);
}
}
}
}
return result;
}
int main() {
vector<int> nums1 = {-1,0,1,2,-1,-4};
vector<int> nums2 = {0,0,0,0};
vector<int> nums3 = {1,2,-2,-1};
auto printTriplets = [](vector<vector<int>>& res) {
cout << "[";
for (auto& t : res) {
cout << "[";
for (int i=0;i<t.size();i++){
cout<<t[i];
if(i<t.size()-1) cout<<",";
}
cout << "]";
}
cout << "]" << endl;
};
printTriplets(threeSumBrute(nums1));
printTriplets(threeSumBrute(nums2));
printTriplets(threeSumBrute(nums3));
}
// Brute-force 3Sum (LC15) - C++
// Time Complexity: O(n^3), Space Complexity: O(1) extra
// Purpose: Demonstrate correctness baseline in interviews
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/**
* Brute-force 3Sum implementation
* Tries all triplets (i,j,k) and returns all unique triplets summing to 0
*
* @param nums input array of integers
* @return vector of triplets [a,b,c] such that a+b+c = 0
*/
vector<vector<int>> threeSumBrute(vector<int>& nums) {
vector<vector<int>> result;
int n = nums.size();
for (int i = 0; i < n-2; i++) {
for (int j = i+1; j < n-1; j++) {
for (int k = j+1; k < n; k++) {
if (nums[i] + nums[j] + nums[k] == 0) {
vector<int> triplet = {nums[i], nums[j], nums[k]};
sort(triplet.begin(), triplet.end());
if (find(result.begin(), result.end(), triplet) == result.end())
result.push_back(triplet);
}
}
}
}
return result;
}
// Example runner
int main() {
vector<int> nums1 = {-1,0,1,2,-1,-4};
vector<int> nums2 = {0,0,0,0};
vector<int> nums3 = {1,2,-2,-1};
auto printTriplets = [](vector<vector<int>>& res) {
cout << "[";
for (auto& t : res) {
cout << "[";
for (int i=0;i<t.size();i++){
cout<<t[i];
if(i<t.size()-1) cout<<",";
}
cout << "]";
}
cout << "]" << endl;
};
printTriplets(threeSumBrute(nums1)); // [[-1,-1,2],[-1,0,1]]
printTriplets(threeSumBrute(nums2)); // [[0,0,0]]
printTriplets(threeSumBrute(nums3)); // []
}
/*
COMMENTS — Brute:
- Simple exhaustive search: tries all combinations of three numbers.
- Duplicates removed by sorting triplet + checking existing result.
- Interview keywords: "three numbers sum to zero", "triplets", "unique combinations".
- Time: O(n^3)
- Space: O(1) extra (excluding result storage)
- Suitable for small input arrays or teaching baseline correctness.
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<vector<int>> threeSumOptimized(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> result;
int n = nums.size();
for (int i = 0; i < n-2; i++) {
if (i > 0 && nums[i] == nums[i-1]) continue;
int left = i+1, right = n-1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
result.push_back({nums[i], nums[left], nums[right]});
left++; right--;
while (left < right && nums[left]==nums[left-1]) left++;
while (left < right && nums[right]==nums[right+1]) right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return result;
}
int main() {
vector<int> nums1 = {-1,0,1,2,-1,-4};
vector<int> nums2 = {0,0,0,0};
vector<int> nums3 = {1,2,-2,-1};
auto printTriplets = [](vector<vector<int>>& res) {
cout << "[";
for (auto& t : res) {
cout << "[";
for (int i=0;i<t.size();i++){
cout<<t[i];
if(i<t.size()-1) cout<<",";
}
cout << "]";
}
cout << "]" << endl;
};
printTriplets(threeSumOptimized(nums1));
printTriplets(threeSumOptimized(nums2));
printTriplets(threeSumOptimized(nums3));
}
// Optimized 3Sum (LC15) - C++
// Sorting + Two Pointers
// Time Complexity: O(n^2), Space Complexity: O(n) for result
// Purpose: Efficient, interview-ready solution
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/**
* Optimized 3Sum using sorting + two pointers
*
* @param nums input array
* @return vector of unique triplets summing to 0
*/
vector<vector<int>> threeSumOptimized(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> result;
int n = nums.size();
for (int i = 0; i < n-2; i++) {
if (i > 0 && nums[i] == nums[i-1]) continue; // skip duplicates
int left = i+1, right = n-1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
result.push_back({nums[i], nums[left], nums[right]});
left++; right--;
while (left < right && nums[left]==nums[left-1]) left++;
while (left < right && nums[right]==nums[right+1]) right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return result;
}
int main() {
vector<int> nums1 = {-1,0,1,2,-1,-4};
vector<int> nums2 = {0,0,0,0};
vector<int> nums3 = {1,2,-2,-1};
auto printTriplets = [](vector<vector<int>>& res) {
cout << "[";
for (auto& t : res) {
cout << "[";
for (int i=0;i<t.size();i++){
cout<<t[i];
if(i<t.size()-1) cout<<",";
}
cout << "]";
}
cout << "]" << endl;
};
printTriplets(threeSumOptimized(nums1)); // [[-1,-1,2],[-1,0,1]]
printTriplets(threeSumOptimized(nums2)); // [[0,0,0]]
printTriplets(threeSumOptimized(nums3)); // []
}
/*
COMMENTS — Optimized:
- Sort input and use two pointers for each fixed element.
- Skip duplicates to maintain uniqueness.
- Time: O(n^2), Space: O(n) for result storage.
- Edge cases: multiple zeros, negative numbers, duplicates.
- Keywords: "sorted array", "two pointers", "skip duplicates", "triplets sum zero".
- Suitable for interviews and large input arrays.
*/
using System;
using System.Collections.Generic;
public class ThreeSumBrute {
public static List<List<int>> ThreeSumBruteForce(int[] nums) {
var result = new List<List<int>>();
int n = nums.Length;
for (int i = 0; i < n-2; i++) {
for (int j = i+1; j < n-1; j++) {
for (int k = j+1; k < n; k++) {
if (nums[i]+nums[j]+nums[k] == 0) {
var triplet = new List<int>{nums[i], nums[j], nums[k]};
triplet.Sort();
bool exists = false;
foreach(var t in result){
if (t[0]==triplet[0] && t[1]==triplet[1] && t[2]==triplet[2]){
exists = true;
break;
}
}
if (!exists) result.Add(triplet);
}
}
}
}
return result;
}
public static void Main() {
int[] nums1 = {-1,0,1,2,-1,-4};
int[] nums2 = {0,0,0,0};
int[] nums3 = {1,2,-2,-1};
Console.WriteLine(String.Join(", ", ThreeSumBruteForce(nums1)));
Console.WriteLine(String.Join(", ", ThreeSumBruteForce(nums2)));
Console.WriteLine(String.Join(", ", ThreeSumBruteForce(nums3)));
}
}
// Brute-force 3Sum (LC15) - C#
// Time Complexity: O(n^3), Space Complexity: O(1) extra
using System;
using System.Collections.Generic;
public class ThreeSumBrute {
public static List<List<int>> ThreeSumBruteForce(int[] nums) {
var result = new List<List<int>>();
int n = nums.Length;
for (int i = 0; i < n-2; i++) {
for (int j = i+1; j < n-1; j++) {
for (int k = j+1; k < n; k++) {
if (nums[i]+nums[j]+nums[k] == 0) {
var triplet = new List<int>{nums[i], nums[j], nums[k]};
triplet.Sort();
bool exists = false;
foreach(var t in result){
if (t[0]==triplet[0] && t[1]==triplet[1] && t[2]==triplet[2]){
exists = true;
break;
}
}
if (!exists) result.Add(triplet);
}
}
}
}
return result;
}
public static void Main() {
int[] nums1 = {-1,0,1,2,-1,-4};
int[] nums2 = {0,0,0,0};
int[] nums3 = {1,2,-2,-1};
Console.WriteLine(String.Join(", ", ThreeSumBruteForce(nums1))); // [[-1,-1,2],[-1,0,1]]
Console.WriteLine(String.Join(", ", ThreeSumBruteForce(nums2))); // [[0,0,0]]
Console.WriteLine(String.Join(", ", ThreeSumBruteForce(nums3))); // []
}
}
/*
COMMENTS — Brute:
- Check all triplets to demonstrate correctness.
- Remove duplicates using sort + manual check.
- Time: O(n^3), Space: O(1) extra.
*/
using System;
using System.Collections.Generic;
public class ThreeSumOptimized {
public static List<List<int>> ThreeSum(int[] nums) {
Array.Sort(nums);
int n = nums.Length;
var result = new List<List<int>>();
for (int i = 0; i < n-2; i++) {
if (i > 0 && nums[i] == nums[i-1]) continue;
int left = i+1, right = n-1;
while (left < right) {
int sum = nums[i]+nums[left]+nums[right];
if (sum == 0) {
result.Add(new List<int>{nums[i], nums[left], nums[right]});
left++; right--;
while (left < right && nums[left]==nums[left-1]) left++;
while (left < right && nums[right]==nums[right+1]) right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return result;
}
public static void Main() {
int[] nums1 = {-1,0,1,2,-1,-4};
int[] nums2 = {0,0,0,0};
int[] nums3 = {1,2,-2,-1};
Console.WriteLine(String.Join(", ", ThreeSum(nums1)));
Console.WriteLine(String.Join(", ", ThreeSum(nums2)));
Console.WriteLine(String.Join(", ", ThreeSum(nums3)));
}
}
// Optimized 3Sum (LC15) - C#
// Sorting + Two Pointers
// Time Complexity: O(n^2), Space Complexity: O(n) for result
using System;
using System.Collections.Generic;
public class ThreeSumOptimized {
public static List<List<int>> ThreeSum(int[] nums) {
Array.Sort(nums);
int n = nums.Length;
var result = new List<List<int>>();
for (int i = 0; i < n-2; i++) {
if (i > 0 && nums[i] == nums[i-1]) continue; // skip duplicates
int left = i+1, right = n-1;
while (left < right) {
int sum = nums[i]+nums[left]+nums[right];
if (sum == 0) {
result.Add(new List<int>{nums[i], nums[left], nums[right]});
left++; right--;
while (left < right && nums[left]==nums[left-1]) left++;
while (left < right && nums[right]==nums[right+1]) right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return result;
}
public static void Main() {
int[] nums1 = {-1,0,1,2,-1,-4};
int[] nums2 = {0,0,0,0};
int[] nums3 = {1,2,-2,-1};
Console.WriteLine(String.Join(", ", ThreeSum(nums1))); // [[-1,-1,2],[-1,0,1]]
Console.WriteLine(String.Join(", ", ThreeSum(nums2))); // [[0,0,0]]
Console.WriteLine(String.Join(", ", ThreeSum(nums3))); // []
}
}
/*
COMMENTS — Optimized:
- Sort array + two pointers for O(n^2) solution.
- Skip duplicates to maintain uniqueness.
- Interview-ready solution.
- Time: O(n^2), Space: O(n) for result.
*/
package main
import (
"fmt"
"sort"
"reflect"
)
func threeSumBrute(nums []int) [][]int {
result := [][]int{}
n := len(nums)
for i := 0; i < n-2; i++ {
for j := i+1; j < n-1; j++ {
for k := j+1; k < n; k++ {
if nums[i]+nums[j]+nums[k]==0 {
triplet := []int{nums[i], nums[j], nums[k]}
sort.Ints(triplet)
exists := false
for _, t := range result {
if reflect.DeepEqual(t, triplet) {
exists = true
break
}
}
if !exists {
result = append(result, triplet)
}
}
}
}
}
return result
}
func main() {
nums1 := []int{-1,0,1,2,-1,-4}
nums2 := []int{0,0,0,0}
nums3 := []int{1,2,-2,-1}
fmt.Println(threeSumBrute(nums1))
fmt.Println(threeSumBrute(nums2))
fmt.Println(threeSumBrute(nums3))
}
// Brute-force 3Sum (LC15) - Go
// Time Complexity: O(n^3), Space Complexity: O(1) extra
package main
import (
"fmt"
"sort"
"reflect"
)
func threeSumBrute(nums []int) [][]int {
result := [][]int{}
n := len(nums)
for i := 0; i < n-2; i++ {
for j := i+1; j < n-1; j++ {
for k := j+1; k < n; k++ {
if nums[i]+nums[j]+nums[k]==0 {
triplet := []int{nums[i], nums[j], nums[k]}
sort.Ints(triplet)
// check duplicates
exists := false
for _, t := range result {
if reflect.DeepEqual(t, triplet) {
exists = true
break
}
}
if !exists {
result = append(result, triplet)
}
}
}
}
}
return result
}
func main() {
nums1 := []int{-1,0,1,2,-1,-4}
nums2 := []int{0,0,0,0}
nums3 := []int{1,2,-2,-1}
fmt.Println(threeSumBrute(nums1)) // [[-1,-1,2],[-1,0,1]]
fmt.Println(threeSumBrute(nums2)) // [[0,0,0]]
fmt.Println(threeSumBrute(nums3)) // []
}
/*
COMMENTS — Brute:
- Tries all triplets for correctness demonstration.
- Duplicates removed by sorting triplet + checking existing slice.
- Time: O(n^3), Space: O(1) extra
- Suitable for interview baseline demonstration.
*/
package main
import (
"fmt"
"sort"
)
func threeSumOptimized(nums []int) [][]int {
sort.Ints(nums)
n := len(nums)
result := [][]int{}
for i := 0; i < n-2; i++ {
if i > 0 && nums[i] == nums[i-1] {
continue
}
left, right := i+1, n-1
for left < right {
sum := nums[i]+nums[left]+nums[right]
if sum == 0 {
result = append(result, []int{nums[i], nums[left], nums[right]})
left++
right--
for left < right && nums[left] == nums[left-1] { left++ }
for left < right && nums[right] == nums[right+1] { right-- }
} else if sum < 0 {
left++
} else {
right--
}
}
}
return result
}
func main() {
nums1 := []int{-1,0,1,2,-1,-4}
nums2 := []int{0,0,0,0}
nums3 := []int{1,2,-2,-1}
fmt.Println(threeSumOptimized(nums1))
fmt.Println(threeSumOptimized(nums2))
fmt.Println(threeSumOptimized(nums3))
}
// Optimized 3Sum (LC15) - Go
// Sorting + Two Pointers
// Time Complexity: O(n^2), Space Complexity: O(n) for result
package main
import (
"fmt"
"sort"
)
func threeSumOptimized(nums []int) [][]int {
sort.Ints(nums)
n := len(nums)
result := [][]int{}
for i := 0; i < n-2; i++ {
if i > 0 && nums[i] == nums[i-1] {
continue // skip duplicates
}
left, right := i+1, n-1
for left < right {
sum := nums[i]+nums[left]+nums[right]
if sum == 0 {
result = append(result, []int{nums[i], nums[left], nums[right]})
left++
right--
for left < right && nums[left] == nums[left-1] { left++ }
for left < right && nums[right] == nums[right+1] { right-- }
} else if sum < 0 {
left++
} else {
right--
}
}
}
return result
}
func main() {
nums1 := []int{-1,0,1,2,-1,-4}
nums2 := []int{0,0,0,0}
nums3 := []int{1,2,-2,-1}
fmt.Println(threeSumOptimized(nums1)) // [[-1,-1,2],[-1,0,1]]
fmt.Println(threeSumOptimized(nums2)) // [[0,0,0]]
fmt.Println(threeSumOptimized(nums3)) // []
}
/*
COMMENTS — Optimized:
- Uses sort + two pointers for O(n^2) time complexity.
- Skips duplicates to ensure unique triplets.
- Time: O(n^2), Space: O(n) for result storage.
- Beginner-friendly explanation: Fix one number, find pair with sum == -fixed.
- Interview tips: Explain pointer movements, skipping duplicates, edge-case handling.
*/
function threeSumBrute(nums: number[]): number[][] {
const result: number[][] = [];
const n = nums.length;
for (let i = 0; i < n - 2; i++) {
for (let j = i + 1; j < n - 1; j++) {
for (let k = j + 1; k < n; k++) {
if (nums[i] + nums[j] + nums[k] === 0) {
const triplet = [nums[i], nums[j], nums[k]].sort((a,b)=>a-b);
if (!result.some(r => r[0] === triplet[0] && r[1] === triplet[1] && r[2] === triplet[2])) {
result.push(triplet);
}
}
}
}
}
return result;
}
console.log(threeSumBrute([-1,0,1,2,-1,-4]));
console.log(threeSumBrute([0,0,0,0]));
console.log(threeSumBrute([1,2,-2,-1]));
// Brute-force 3Sum (LC15) - TypeScript
// Time Complexity: O(n^3), Space Complexity: O(1) extra (excluding result array)
// Purpose: Demonstrate baseline correctness in interviews
function threeSumBrute(nums: number[]): number[][] {
const result: number[][] = [];
const n = nums.length;
for (let i = 0; i < n - 2; i++) {
for (let j = i + 1; j < n - 1; j++) {
for (let k = j + 1; k < n; k++) {
if (nums[i] + nums[j] + nums[k] === 0) {
const triplet = [nums[i], nums[j], nums[k]].sort((a,b)=>a-b);
if (!result.some(r => r[0] === triplet[0] && r[1] === triplet[1] && r[2] === triplet[2])) {
result.push(triplet);
}
}
}
}
}
return result;
}
// Test cases
console.log(threeSumBrute([-1,0,1,2,-1,-4])); // [[-1,-1,2], [-1,0,1]]
console.log(threeSumBrute([0,0,0,0])); // [[0,0,0]]
console.log(threeSumBrute([1,2,-2,-1])); // []
/*
COMMENTS — Brute:
- Triple nested loops check all i<j<k combinations.
- Sort + uniqueness check prevents duplicates.
- Useful in interviews to show correctness baseline.
- Step-by-step: iterate, sum, append if zero.
- Time: O(n^3), Space: O(1) extra besides result.
*/
function threeSumOptimized(nums: number[]): number[][] {
nums.sort((a,b)=>a-b);
const result: number[][] = [];
const n = nums.length;
for (let i = 0; i < n-2; i++) {
if (i > 0 && nums[i] === nums[i-1]) continue;
let left = i + 1;
let right = n - 1;
while (left < right) {
const sum = nums[i] + nums[left] + nums[right];
if (sum === 0) {
result.push([nums[i], nums[left], nums[right]]);
left++;
right--;
while (left < right && nums[left] === nums[left-1]) left++;
while (left < right && nums[right] === nums[right+1]) right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return result;
}
console.log(threeSumOptimized([-1,0,1,2,-1,-4]));
console.log(threeSumOptimized([0,0,0,0]));
console.log(threeSumOptimized([1,2,-2,-1]));
// Optimized 3Sum (LC15) - TypeScript
// Time Complexity: O(n^2), Space Complexity: O(n) for result
// Approach: Sorting + Two Pointers
function threeSumOptimized(nums: number[]): number[][] {
nums.sort((a,b)=>a-b);
const result: number[][] = [];
const n = nums.length;
for (let i = 0; i < n-2; i++) {
if (i > 0 && nums[i] === nums[i-1]) continue; // skip duplicate first element
let left = i + 1;
let right = n - 1;
while (left < right) {
const sum = nums[i] + nums[left] + nums[right];
if (sum === 0) {
result.push([nums[i], nums[left], nums[right]]);
left++;
right--;
while (left < right && nums[left] === nums[left-1]) left++;
while (left < right && nums[right] === nums[right+1]) right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return result;
}
// Test cases
console.log(threeSumOptimized([-1,0,1,2,-1,-4])); // [[-1,-1,2], [-1,0,1]]
console.log(threeSumOptimized([0,0,0,0])); // [[0,0,0]]
console.log(threeSumOptimized([1,2,-2,-1])); // []
/*
COMMENTS — Optimized:
- Sorting + two-pointer reduces time to O(n^2).
- Skip duplicates for first element and pointer movement.
- Step-by-step: fix i, move left/right pointers to find sum=0.
- Space: O(n) for result array.
- Edge cases: multiple zeros, negatives, empty input, no triplets.
- Interview tip: explain pointer movement & duplicate skipping clearly.
*/
<?php
// Optimized 3Sum (LC15) - PHP
// Time Complexity: O(n^2), Space Complexity: O(n) for result
// Approach: Sorting + Two Pointers
function threeSumOptimized($nums) {
sort($nums); // Sort array for two-pointer approach
$n = count($nums);
$result = [];
for ($i = 0; $i < $n - 2; $i++) {
if ($i > 0 && $nums[$i] === $nums[$i - 1]) continue; // skip duplicate first element
$left = $i + 1;
$right = $n - 1;
while ($left < $right) {
$sum = $nums[$i] + $nums[$left] + $nums[$right];
if ($sum === 0) {
$result[] = [$nums[$i], $nums[$left], $nums[$right]];
$left++;
$right--;
while ($left < $right && $nums[$left] === $nums[$left - 1]) $left++;
while ($left < $right && $nums[$right] === $nums[$right + 1]) $right--;
} elseif ($sum < 0) {
$left++;
} else {
$right--;
}
}
}
return $result;
}
// Example executions
$nums1 = [-1,0,1,2,-1,-4];
$nums2 = [0,0,0,0];
$nums3 = [1,2,-2,-1];
print_r(threeSumOptimized($nums1)); // [[-1,-1,2], [-1,0,1]]
print_r(threeSumOptimized($nums2)); // [[0,0,0]]
print_r(threeSumOptimized($nums3)); // []
/*
COMMENTS — Optimized:
- Sorting + two-pointer reduces time complexity to O(n^2).
- Skip duplicate first element and duplicates for left/right pointers.
- Step-by-step: fix nums[i], move pointers to sum 0.
- Space O(n) for storing result.
- Edge cases: multiple zeros, negative numbers, empty array.
- Interview tip: explain pointer movement & duplicate skipping.
*/
?>
<?php
// Optimized 3Sum (LC15) - PHP
// Time Complexity: O(n^2), Space Complexity: O(n) for result
// Approach: Sorting + Two Pointers
function threeSumOptimized($nums) {
sort($nums); // Sort array for two-pointer approach
$n = count($nums);
$result = [];
for ($i = 0; $i < $n - 2; $i++) {
if ($i > 0 && $nums[$i] === $nums[$i - 1]) continue; // skip duplicate first element
$left = $i + 1;
$right = $n - 1;
while ($left < $right) {
$sum = $nums[$i] + $nums[$left] + $nums[$right];
if ($sum === 0) {
$result[] = [$nums[$i], $nums[$left], $nums[$right]];
$left++;
$right--;
while ($left < $right && $nums[$left] === $nums[$left - 1]) $left++;
while ($left < $right && $nums[$right] === $nums[$right + 1]) $right--;
} elseif ($sum < 0) {
$left++;
} else {
$right--;
}
}
}
return $result;
}
// Example executions
$nums1 = [-1,0,1,2,-1,-4];
$nums2 = [0,0,0,0];
$nums3 = [1,2,-2,-1];
print_r(threeSumOptimized($nums1)); // [[-1,-1,2], [-1,0,1]]
print_r(threeSumOptimized($nums2)); // [[0,0,0]]
print_r(threeSumOptimized($nums3)); // []
/*
COMMENTS — Optimized:
- Sorting + two-pointer reduces time complexity to O(n^2).
- Skip duplicate first element and duplicates for left/right pointers.
- Step-by-step: fix nums[i], move pointers to sum 0.
- Space O(n) for storing result.
- Edge cases: multiple zeros, negative numbers, empty array.
- Interview tip: explain pointer movement & duplicate skipping.
*/
?>
def three_sum_optimized(nums)
nums.sort!
result = []
n = nums.size
(0..n-3).each do |i|
next if i > 0 && nums[i] == nums[i-1]
left = i + 1
right = n - 1
while left < right
sum = nums[i] + nums[left] + nums[right]
if sum == 0
result << [nums[i], nums[left], nums[right]]
left += 1
right -= 1
left += 1 while left < right && nums[left] == nums[left-1]
right -= 1 while left < right && nums[right] == nums[right+1]
elsif sum < 0
left += 1
else
right -= 1
end
end
end
result
end
nums1 = [-1,0,1,2,-1,-4]
nums2 = [0,0,0,0]
nums3 = [1,2,-2,-1]
puts three_sum_optimized(nums1).inspect
puts three_sum_optimized(nums2).inspect
puts three_sum_optimized(nums3).inspect
# Optimized 3Sum (LC15) - Ruby
# Time Complexity: O(n^2), Space Complexity: O(n) for result
# Approach: Sorting + Two Pointers
def three_sum_optimized(nums)
nums.sort!
result = []
n = nums.size
(0..n-3).each do |i|
next if i > 0 && nums[i] == nums[i-1] # skip duplicate first element
left = i + 1
right = n - 1
while left < right
sum = nums[i] + nums[left] + nums[right]
if sum == 0
result << [nums[i], nums[left], nums[right]]
left += 1
right -= 1
left += 1 while left < right && nums[left] == nums[left-1]
right -= 1 while left < right && nums[right] == nums[right+1]
elsif sum < 0
left += 1
else
right -= 1
end
end
end
result
end
# Example executions
nums1 = [-1,0,1,2,-1,-4]
nums2 = [0,0,0,0]
nums3 = [1,2,-2,-1]
puts three_sum_optimized(nums1).inspect # [[-1,-1,2], [-1,0,1]]
puts three_sum_optimized(nums2).inspect # [[0,0,0]]
puts three_sum_optimized(nums3).inspect # []
=begin
COMMENTS — Optimized:
- Sorting + two-pointer reduces time to O(n^2).
- Skip duplicate first element and duplicates on pointers.
- Step-by-step: fix nums[i], move left/right to reach sum 0.
- Space O(n) for result storage.
- Edge cases: multiple zeros, negative numbers, no triplets.
- Interview tip: explain pointer movement & duplicate skipping.
=end
func threeSumBrute(_ nums: [Int]) -> [[Int]] {
var result: [[Int]] = []
let n = nums.count
for i in 0..<n-2 {
for j in i+1..<n-1 {
for k in j+1..<n {
if nums[i] + nums[j] + nums[k] == 0 {
let triplet = [nums[i], nums[j], nums[k]].sorted()
if !result.contains(where: { $0 == triplet }) {
result.append(triplet)
}
}
}
}
}
return result
}
let nums1 = [-1,0,1,2,-1,-4]
let nums2 = [0,0,0,0]
let nums3 = [1,2,-2,-1]
print(threeSumBrute(nums1))
print(threeSumBrute(nums2))
print(threeSumBrute(nums3))
// Brute-force 3Sum (LC15) - Swift
// Time Complexity: O(n^3), Space Complexity: O(1) extra (excluding result array)
// Purpose: Demonstrate baseline correctness for interviews
func threeSumBrute(_ nums: [Int]) -> [[Int]] {
var result: [[Int]] = []
let n = nums.count
for i in 0..<n-2 {
for j in i+1..<n-1 {
for k in j+1..<n {
if nums[i] + nums[j] + nums[k] == 0 {
let triplet = [nums[i], nums[j], nums[k]].sorted()
if !result.contains(where: { $0 == triplet }) {
result.append(triplet)
}
}
}
}
}
return result
}
// Test cases
let nums1 = [-1,0,1,2,-1,-4]
let nums2 = [0,0,0,0]
let nums3 = [1,2,-2,-1]
print(threeSumBrute(nums1)) // [[-1,-1,2], [-1,0,1]]
print(threeSumBrute(nums2)) // [[0,0,0]]
print(threeSumBrute(nums3)) // []
/*
COMMENTS — Brute:
- Triple nested loops check all i<j<k combinations.
- Sort each triplet + uniqueness check prevents duplicates.
- Step-by-step: iterate, sum, append if zero.
- Time: O(n^3), Space: O(1) extra besides result array.
- Useful in interviews to demonstrate correctness baseline.
*/
func threeSumOptimized(_ nums: [Int]) -> [[Int]] {
let sortedNums = nums.sorted()
let n = sortedNums.count
var result: [[Int]] = []
for i in 0..<n-2 {
if i > 0 && sortedNums[i] == sortedNums[i-1] { continue }
var left = i + 1
var right = n - 1
while left < right {
let sum = sortedNums[i] + sortedNums[left] + sortedNums[right]
if sum == 0 {
result.append([sortedNums[i], sortedNums[left], sortedNums[right]])
left += 1
right -= 1
while left < right && sortedNums[left] == sortedNums[left-1] { left += 1 }
while left < right && sortedNums[right] == sortedNums[right+1] { right -= 1 }
} else if sum < 0 {
left += 1
} else {
right -= 1
}
}
}
return result
}
let nums1 = [-1,0,1,2,-1,-4]
let nums2 = [0,0,0,0]
let nums3 = [1,2,-2,-1]
print(threeSumOptimized(nums1))
print(threeSumOptimized(nums2))
print(threeSumOptimized(nums3))
// Optimized 3Sum (LC15) - Swift
// Time Complexity: O(n^2), Space Complexity: O(n) for result
// Approach: Sorting + Two Pointers
func threeSumOptimized(_ nums: [Int]) -> [[Int]] {
let sortedNums = nums.sorted()
let n = sortedNums.count
var result: [[Int]] = []
for i in 0..<n-2 {
if i > 0 && sortedNums[i] == sortedNums[i-1] { continue } // skip duplicate first element
var left = i + 1
var right = n - 1
while left < right {
let sum = sortedNums[i] + sortedNums[left] + sortedNums[right]
if sum == 0 {
result.append([sortedNums[i], sortedNums[left], sortedNums[right]])
left += 1
right -= 1
while left < right && sortedNums[left] == sortedNums[left-1] { left += 1 }
while left < right && sortedNums[right] == sortedNums[right+1] { right -= 1 }
} else if sum < 0 {
left += 1
} else {
right -= 1
}
}
}
return result
}
// Test cases
let nums1 = [-1,0,1,2,-1,-4]
let nums2 = [0,0,0,0]
let nums3 = [1,2,-2,-1]
print(threeSumOptimized(nums1)) // [[-1,-1,2], [-1,0,1]]
print(threeSumOptimized(nums2)) // [[0,0,0]]
print(threeSumOptimized(nums3)) // []
/*
COMMENTS — Optimized:
- Sorting + two-pointer reduces time complexity to O(n^2).
- Skip duplicates for the first element and pointer movement.
- Step-by-step: fix i, move left/right pointers to find sum=0.
- Space: O(n) for result array.
- Edge cases: multiple zeros, negatives, empty input, no triplets.
- Interview tip: explain pointer movement & duplicate skipping clearly.
*/
fun threeSumBrute(nums: IntArray): List<List<Int>> {
val result = mutableListOf<List<Int>>()
val n = nums.size
for (i in 0 until n-2) {
for (j in i+1 until n-1) {
for (k in j+1 until n) {
if (nums[i] + nums[j] + nums[k] == 0) {
val triplet = listOf(nums[i], nums[j], nums[k]).sorted()
if (!result.contains(triplet)) {
result.add(triplet)
}
}
}
}
}
return result
}
fun main() {
val nums1 = intArrayOf(-1,0,1,2,-1,-4)
val nums2 = intArrayOf(0,0,0,0)
val nums3 = intArrayOf(1,2,-2,-1)
println(threeSumBrute(nums1))
println(threeSumBrute(nums2))
println(threeSumBrute(nums3))
}
// Brute-force 3Sum (LC15) - Kotlin
// Time Complexity: O(n^3), Space Complexity: O(1) extra
fun threeSumBrute(nums: IntArray): List<List<Int>> {
val result = mutableListOf<List<Int>>()
val n = nums.size
for (i in 0 until n-2) {
for (j in i+1 until n-1) {
for (k in j+1 until n) {
if (nums[i] + nums[j] + nums[k] == 0) {
val triplet = listOf(nums[i], nums[j], nums[k]).sorted()
if (!result.contains(triplet)) {
result.add(triplet)
}
}
}
}
}
return result
}
fun main() {
val nums1 = intArrayOf(-1,0,1,2,-1,-4)
val nums2 = intArrayOf(0,0,0,0)
val nums3 = intArrayOf(1,2,-2,-1)
println(threeSumBrute(nums1)) // [[-1,-1,2], [-1,0,1]]
println(threeSumBrute(nums2)) // [[0,0,0]]
println(threeSumBrute(nums3)) // []
}
/*
COMMENTS — Brute:
- Triple nested loop checks all combinations.
- Sorting triplet + contains ensures uniqueness.
- Time O(n^3), Space O(1) extra
- Beginner-friendly explanation: i,j,k loop, sum check, store unique.
- Useful in interviews to demonstrate correctness baseline.
*/
fun twoSumOptimizedKotlin(nums: IntArray, target: Int): IntArray {
val seen = HashMap<Int, Int>()
for (i in nums.indices) {
val x = nums[i]
val c = target - x
if (seen.containsKey(c)) return intArrayOf(seen[c]!!, i)
seen[x] = i
}
return intArrayOf()
}
fun main() {
println(twoSumOptimizedKotlin(intArrayOf(2,7,11,15), 9).joinToString())
}
// File: kotlin.optimized.kt
// One-pass HashMap Two Sum (Kotlin)
// Time: O(n) average, Space: O(n)
fun twoSumOptimizedKotlin(nums: IntArray, target: Int): IntArray {
val seen = HashMap<Int, Int>()
for (i in nums.indices) {
val x = nums[i]
val c = target - x
if (seen.containsKey(c)) return intArrayOf(seen[c]!!, i)
seen[x] = i
}
return intArrayOf()
}
fun main() {
println(twoSumOptimizedKotlin(intArrayOf(2,7,11,15), 9).joinToString()) // 0, 1
}
/*
Comments (Kotlin)
- Similar approach to Java; use HashMap for seen values.
- Complexity: O(n) time average, O(n) space.
*/
object ThreeSumBrute {
def threeSum(nums: Array[Int]): List[List[Int]] = {
val result = scala.collection.mutable.ListBuffer[List[Int]]()
val n = nums.length
for (i <- 0 until n-2) {
for (j <- i+1 until n-1) {
for (k <- j+1 until n) {
if (nums(i) + nums(j) + nums(k) == 0) {
val triplet = List(nums(i), nums(j), nums(k)).sorted
if (!result.contains(triplet)) {
result += triplet
}
}
}
}
}
result.toList
}
def main(args: Array[String]): Unit = {
val nums1 = Array(-1,0,1,2,-1,-4)
val nums2 = Array(0,0,0,0)
val nums3 = Array(1,2,-2,-1)
println(threeSum(nums1))
println(threeSum(nums2))
println(threeSum(nums3))
}
}
// Brute-force 3Sum (LC15) - Scala
// Time Complexity: O(n^3), Space Complexity: O(1) extra (excluding result)
// Purpose: Demonstrate correctness baseline for interviews
object ThreeSumBrute {
def threeSum(nums: Array[Int]): List[List[Int]] = {
val result = scala.collection.mutable.ListBuffer[List[Int]]()
val n = nums.length
for (i <- 0 until n-2) {
for (j <- i+1 until n-1) {
for (k <- j+1 until n) {
if (nums(i) + nums(j) + nums(k) == 0) {
val triplet = List(nums(i), nums(j), nums(k)).sorted
if (!result.contains(triplet)) {
result += triplet
}
}
}
}
}
result.toList
}
def main(args: Array[String]): Unit = {
val nums1 = Array(-1,0,1,2,-1,-4)
val nums2 = Array(0,0,0,0)
val nums3 = Array(1,2,-2,-1)
println(threeSum(nums1)) // [[-1,-1,2], [-1,0,1]]
println(threeSum(nums2)) // [[0,0,0]]
println(threeSum(nums3)) // []
}
}
/*
COMMENTS — Brute:
- Triple nested loops check all combinations i<j<k.
- Sort triplets + uniqueness check prevents duplicates.
- Step-by-step: iterate, sum, append if zero.
- Time: O(n^3), Space: O(1) extra besides result list.
- Useful for interview demonstration.
*/
object ThreeSumOptimized {
def threeSum(nums: Array[Int]): List[List[Int]] = {
val sorted = nums.sorted
val n = sorted.length
val result = scala.collection.mutable.ListBuffer[List[Int]]()
for (i <- 0 until n-2) {
if (i > 0 && sorted(i) == sorted(i-1)) {
} else {
var left = i + 1
var right = n - 1
while (left < right) {
val sum = sorted(i) + sorted(left) + sorted(right)
if (sum == 0) {
result += List(sorted(i), sorted(left), sorted(right))
left += 1
right -= 1
while (left < right && sorted(left) == sorted(left-1)) left += 1
while (left < right && sorted(right) == sorted(right+1)) right -= 1
} else if (sum < 0) {
left += 1
} else {
right -= 1
}
}
}
}
result.toList
}
def main(args: Array[String]): Unit = {
val nums1 = Array(-1,0,1,2,-1,-4)
val nums2 = Array(0,0,0,0)
val nums3 = Array(1,2,-2,-1)
println(threeSum(nums1))
println(threeSum(nums2))
println(threeSum(nums3))
}
}
// Optimized 3Sum (LC15) - Scala
// Time Complexity: O(n^2), Space Complexity: O(n) for result
// Approach: Sorting + Two Pointers
object ThreeSumOptimized {
def threeSum(nums: Array[Int]): List[List[Int]] = {
val sorted = nums.sorted
val n = sorted.length
val result = scala.collection.mutable.ListBuffer[List[Int]]()
for (i <- 0 until n-2) {
if (i > 0 && sorted(i) == sorted(i-1)) { // skip duplicate first element
// skip
} else {
var left = i + 1
var right = n - 1
while (left < right) {
val sum = sorted(i) + sorted(left) + sorted(right)
if (sum == 0) {
result += List(sorted(i), sorted(left), sorted(right))
left += 1
right -= 1
while (left < right && sorted(left) == sorted(left-1)) left += 1
while (left < right && sorted(right) == sorted(right+1)) right -= 1
} else if (sum < 0) {
left += 1
} else {
right -= 1
}
}
}
}
result.toList
}
def main(args: Array[String]): Unit = {
val nums1 = Array(-1,0,1,2,-1,-4)
val nums2 = Array(0,0,0,0)
val nums3 = Array(1,2,-2,-1)
println(threeSum(nums1)) // [[-1,-1,2], [-1,0,1]]
println(threeSum(nums2)) // [[0,0,0]]
println(threeSum(nums3)) // []
}
}
/*
COMMENTS — Optimized:
- Sorting + two-pointer reduces time to O(n^2).
- Skip duplicates for first element and pointers.
- Step-by-step: fix i, move left/right pointers to sum=0.
- Space O(n) for result storage.
- Edge cases: multiple zeros, negatives, empty array, no triplets.
- Interview tip: explain pointer movement & duplicate skipping.
*/
fn three_sum_brute(nums: Vec<i32>) -> Vec<Vec<i32>> {
let mut result: Vec<Vec<i32>> = Vec::new();
let n = nums.len();
for i in 0..n-2 {
for j in i+1..n-1 {
for k in j+1..n {
if nums[i] + nums[j] + nums[k] == 0 {
let mut triplet = vec![nums[i], nums[j], nums[k]];
triplet.sort();
if !result.contains(&triplet) {
result.push(triplet);
}
}
}
}
}
result
}
fn main() {
let nums1 = vec![-1,0,1,2,-1,-4];
let nums2 = vec![0,0,0,0];
let nums3 = vec![1,2,-2,-1];
println!("{:?}", three_sum_brute(nums1));
println!("{:?}", three_sum_brute(nums2));
println!("{:?}", three_sum_brute(nums3));
}
// Brute-force 3Sum (LC15) - Rust
// Time Complexity: O(n^3), Space Complexity: O(1) extra (except result vector)
// Purpose: Demonstrate baseline correctness for interviews
fn three_sum_brute(nums: Vec<i32>) -> Vec<Vec<i32>> {
let mut result: Vec<Vec<i32>> = Vec::new();
let n = nums.len();
for i in 0..n-2 {
for j in i+1..n-1 {
for k in j+1..n {
if nums[i] + nums[j] + nums[k] == 0 {
let mut triplet = vec![nums[i], nums[j], nums[k]];
triplet.sort();
if !result.contains(&triplet) {
result.push(triplet);
}
}
}
}
}
result
}
fn main() {
let nums1 = vec![-1,0,1,2,-1,-4];
let nums2 = vec![0,0,0,0];
let nums3 = vec![1,2,-2,-1];
println!("{:?}", three_sum_brute(nums1)); // [[-1,-1,2], [-1,0,1]]
println!("{:?}", three_sum_brute(nums2)); // [[0,0,0]]
println!("{:?}", three_sum_brute(nums3)); // []
}
/*
COMMENTS — Brute:
- Triple nested loop checks all i<j<k combinations.
- Sort + uniqueness ensures no duplicate triplets.
- Step-by-step: iterate, sum, append if zero.
- Time: O(n^3), Space: O(1) extra besides result vector.
- Useful in interviews to demonstrate correctness baseline.
*/
fn three_sum_optimized(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
nums.sort();
let n = nums.len();
let mut result: Vec<Vec<i32>> = Vec::new();
for i in 0..n-2 {
if i > 0 && nums[i] == nums[i-1] { continue; }
let mut left = i + 1;
let mut right = n - 1;
while left < right {
let sum = nums[i] + nums[left] + nums[right];
if sum == 0 {
result.push(vec![nums[i], nums[left], nums[right]]);
left += 1;
right -= 1;
while left < right && nums[left] == nums[left-1] { left += 1; }
while left < right && nums[right] == nums[right+1] { right -= 1; }
} else if sum < 0 {
left += 1;
} else {
right -= 1;
}
}
}
result
}
fn main() {
let nums1 = vec![-1,0,1,2,-1,-4];
let nums2 = vec![0,0,0,0];
let nums3 = vec![1,2,-2,-1];
println!("{:?}", three_sum_optimized(nums1));
println!("{:?}", three_sum_optimized(nums2));
println!("{:?}", three_sum_optimized(nums3));
}
// Optimized 3Sum (LC15) - Rust
// Time Complexity: O(n^2), Space Complexity: O(n) for result
// Approach: Sorting + Two Pointers
fn three_sum_optimized(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
nums.sort();
let n = nums.len();
let mut result: Vec<Vec<i32>> = Vec::new();
for i in 0..n-2 {
if i > 0 && nums[i] == nums[i-1] { continue; } // skip duplicate first element
let mut left = i + 1;
let mut right = n - 1;
while left < right {
let sum = nums[i] + nums[left] + nums[right];
if sum == 0 {
result.push(vec![nums[i], nums[left], nums[right]]);
left += 1;
right -= 1;
while left < right && nums[left] == nums[left-1] { left += 1; }
while left < right && nums[right] == nums[right+1] { right -= 1; }
} else if sum < 0 {
left += 1;
} else {
right -= 1;
}
}
}
result
}
fn main() {
let nums1 = vec![-1,0,1,2,-1,-4];
let nums2 = vec![0,0,0,0];
let nums3 = vec![1,2,-2,-1];
println!("{:?}", three_sum_optimized(nums1)); // [[-1,-1,2], [-1,0,1]]
println!("{:?}", three_sum_optimized(nums2)); // [[0,0,0]]
println!("{:?}", three_sum_optimized(nums3)); // []
}
/*
COMMENTS — Optimized:
- Sorting + two-pointer reduces time complexity to O(n^2).
- Skip duplicate first element and duplicates while moving pointers.
- Step-by-step: fix nums[i], move left/right to find sum=0.
- Space: O(n) for result vector.
- Edge cases: multiple zeros, negative numbers, empty input, no triplets.
- Interview tip: explain pointer movement & duplicate skipping clearly.
*/
<?php
function threeSumBrute($nums) {
$result = [];
$n = count($nums);
for ($i = 0; $i < $n - 2; $i++) {
for ($j = $i + 1; $j < $n - 1; $j++) {
for ($k = $j + 1; $k < $n; $k++) {
if ($nums[$i] + $nums[$j] + $nums[$k] === 0) {
$triplet = [$nums[$i], $nums[$j], $nums[$k]];
sort($triplet);
$exists = false;
foreach ($result as $t) {
if ($t === $triplet) {
$exists = true;
break;
}
}
if (!$exists) {
$result[] = $triplet;
}
}
}
}
}
return $result;
}
$nums1 = [-1,0,1,2,-1,-4];
$nums2 = [0,0,0,0];
$nums3 = [1,2,-2,-1];
print_r(threeSumBrute($nums1));
print_r(threeSumBrute($nums2));
print_r(threeSumBrute($nums3));
?>
<?php
// Brute-force 3Sum (LC15) - PHP
// Time Complexity: O(n^3), Space Complexity: O(1) extra
// Purpose: Demonstrate correctness baseline for interviews
function threeSumBrute($nums) {
$result = [];
$n = count($nums);
for ($i = 0; $i < $n - 2; $i++) {
for ($j = $i + 1; $j < $n - 1; $j++) {
for ($k = $j + 1; $k < $n; $k++) {
if ($nums[$i] + $nums[$j] + $nums[$k] === 0) {
$triplet = [$nums[$i], $nums[$j], $nums[$k]];
sort($triplet);
// Check for duplicates
$exists = false;
foreach ($result as $t) {
if ($t === $triplet) {
$exists = true;
break;
}
}
if (!$exists) {
$result[] = $triplet;
}
}
}
}
}
return $result;
}
// Example executions
$nums1 = [-1,0,1,2,-1,-4];
$nums2 = [0,0,0,0];
$nums3 = [1,2,-2,-1];
print_r(threeSumBrute($nums1)); // [[-1,-1,2], [-1,0,1]]
print_r(threeSumBrute($nums2)); // [[0,0,0]]
print_r(threeSumBrute($nums3)); // []
/*
COMMENTS — Brute:
- Triple nested loops check all combinations.
- Sort triplets + uniqueness check ensures no duplicates.
- Step-by-step: i,j,k check sum, append if zero.
- Time: O(n^3), Space: O(1) extra.
- Useful in interviews to demonstrate baseline correctness.
*/
?>
<?php
function threeSumBrute($nums) {
$result = [];
$n = count($nums);
for ($i = 0; $i < $n - 2; $i++) {
for ($j = $i + 1; $j < $n - 1; $j++) {
for ($k = $j + 1; $k < $n; $k++) {
if ($nums[$i] + $nums[$j] + $nums[$k] === 0) {
$triplet = [$nums[$i], $nums[$j], $nums[$k]];
sort($triplet);
$exists = false;
foreach ($result as $t) {
if ($t === $triplet) {
$exists = true;
break;
}
}
if (!$exists) {
$result[] = $triplet;
}
}
}
}
}
return $result;
}
$nums1 = [-1,0,1,2,-1,-4];
$nums2 = [0,0,0,0];
$nums3 = [1,2,-2,-1];
print_r(threeSumBrute($nums1));
print_r(threeSumBrute($nums2));
print_r(threeSumBrute($nums3));
?>
<?php
// Brute-force 3Sum (LC15) - PHP
// Time Complexity: O(n^3), Space Complexity: O(1) extra
// Purpose: Demonstrate correctness baseline for interviews
function threeSumBrute($nums) {
$result = [];
$n = count($nums);
for ($i = 0; $i < $n - 2; $i++) {
for ($j = $i + 1; $j < $n - 1; $j++) {
for ($k = $j + 1; $k < $n; $k++) {
if ($nums[$i] + $nums[$j] + $nums[$k] === 0) {
$triplet = [$nums[$i], $nums[$j], $nums[$k]];
sort($triplet);
// Check for duplicates
$exists = false;
foreach ($result as $t) {
if ($t === $triplet) {
$exists = true;
break;
}
}
if (!$exists) {
$result[] = $triplet;
}
}
}
}
}
return $result;
}
// Example executions
$nums1 = [-1,0,1,2,-1,-4];
$nums2 = [0,0,0,0];
$nums3 = [1,2,-2,-1];
print_r(threeSumBrute($nums1)); // [[-1,-1,2], [-1,0,1]]
print_r(threeSumBrute($nums2)); // [[0,0,0]]
print_r(threeSumBrute($nums3)); // []
/*
COMMENTS — Brute:
- Triple nested loops check all combinations.
- Sort triplets + uniqueness check ensures no duplicates.
- Step-by-step: i,j,k check sum, append if zero.
- Time: O(n^3), Space: O(1) extra.
- Useful in interviews to demonstrate baseline correctness.
*/
?>
void main() {
List<List<int>> threeSumBrute(List<int> nums) {
List<List<int>> result = [];
int n = nums.length;
for (int i = 0; i < n - 2; i++) {
for (int j = i + 1; j < n - 1; j++) {
for (int k = j + 1; k < n; k++) {
if (nums[i] + nums[j] + nums[k] == 0) {
List<int> triplet = [nums[i], nums[j], nums[k]];
triplet.sort();
bool exists = result.any((t) => t[0] == triplet[0] && t[1] == triplet[1] && t[2] == triplet[2]);
if (!exists) {
result.add(triplet);
}
}
}
}
}
return result;
}
List<int> nums1 = [-1,0,1,2,-1,-4];
List<int> nums2 = [0,0,0,0];
List<int> nums3 = [1,2,-2,-1];
print(threeSumBrute(nums1));
print(threeSumBrute(nums2));
print(threeSumBrute(nums3));
}
// Brute-force 3Sum (LC15) - Dart
// Time Complexity: O(n^3), Space Complexity: O(1) extra
// Purpose: Demonstrate correctness baseline in interviews
void main() {
List<List<int>> threeSumBrute(List<int> nums) {
List<List<int>> result = [];
int n = nums.length;
for (int i = 0; i < n - 2; i++) {
for (int j = i + 1; j < n - 1; j++) {
for (int k = j + 1; k < n; k++) {
if (nums[i] + nums[j] + nums[k] == 0) {
List<int> triplet = [nums[i], nums[j], nums[k]];
triplet.sort(); // sort to handle duplicates
// check if triplet already exists
bool exists = result.any((t) => t[0] == triplet[0] && t[1] == triplet[1] && t[2] == triplet[2]);
if (!exists) {
result.add(triplet);
}
}
}
}
}
return result;
}
// Example executions
List<int> nums1 = [-1,0,1,2,-1,-4];
List<int> nums2 = [0,0,0,0];
List<int> nums3 = [1,2,-2,-1];
print(threeSumBrute(nums1)); // [[-1,-1,2], [-1,0,1]]
print(threeSumBrute(nums2)); // [[0,0,0]]
print(threeSumBrute(nums3)); // []
}
/*
COMMENTS — Brute:
- Checks all triplets i<j<k.
- Sorts triplets and removes duplicates for uniqueness.
- Step-by-step execution: loops i,j,k check sum, append if zero.
- Time: O(n^3), Space: O(1) extra
- Interview keywords: "three numbers", "sum zero", "triplets".
*/
void main() {
List<List<int>> threeSumOptimized(List<int> nums) {
nums.sort();
int n = nums.length;
List<List<int>> result = [];
for (int i = 0; i < n - 2; i++) {
if (i > 0 && nums[i] == nums[i - 1]) continue;
int left = i + 1, right = n - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
result.add([nums[i], nums[left], nums[right]]);
left++;
right--;
while (left < right && nums[left] == nums[left - 1]) left++;
while (left < right && nums[right] == nums[right + 1]) right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return result;
}
List<int> nums1 = [-1,0,1,2,-1,-4];
List<int> nums2 = [0,0,0,0];
List<int> nums3 = [1,2,-2,-1];
print(threeSumOptimized(nums1));
print(threeSumOptimized(nums2));
print(threeSumOptimized(nums3));
}
// Optimized 3Sum (LC15) - Dart
// Time Complexity: O(n^2), Space Complexity: O(n) for result
// Sorting + Two Pointers
void main() {
List<List<int>> threeSumOptimized(List<int> nums) {
nums.sort(); // sort array for two-pointer approach
int n = nums.length;
List<List<int>> result = [];
for (int i = 0; i < n - 2; i++) {
if (i > 0 && nums[i] == nums[i - 1]) continue; // skip duplicate first element
int left = i + 1, right = n - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
result.add([nums[i], nums[left], nums[right]]);
left++;
right--;
// skip duplicates
while (left < right && nums[left] == nums[left - 1]) left++;
while (left < right && nums[right] == nums[right + 1]) right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return result;
}
// Example executions
List<int> nums1 = [-1,0,1,2,-1,-4];
List<int> nums2 = [0,0,0,0];
List<int> nums3 = [1,2,-2,-1];
print(threeSumOptimized(nums1)); // [[-1,-1,2], [-1,0,1]]
print(threeSumOptimized(nums2)); // [[0,0,0]]
print(threeSumOptimized(nums3)); // []
}
/*
COMMENTS — Optimized:
- Sort + two-pointer reduces time complexity to O(n^2).
- Skip duplicate first element and duplicate pointers.
- Step-by-step: Fix first element, move left/right to match sum.
- Edge cases: multiple zeros, duplicates, negative numbers.
- Space: O(n) for storing result.
- Interview tip: Explain pointer movements and duplicate skipping clearly.
*/