15. Triplet sum
#include <stdlib.h>
static int cmp(const void *a, const void *b) {
return *(const int *)a - *(const int *)b;
}
int **threeSum(int *nums, int numsSize, int *returnSize, int **returnColumnSizes) {
qsort(nums, numsSize, sizeof(int), cmp);
int capacity = 16;
int **result = malloc(capacity * sizeof(int *));
*returnColumnSizes = malloc(capacity * sizeof(int));
*returnSize = 0;
for (int idx = 0; idx < numsSize; idx++) {
if (idx > 0 && nums[idx] == nums[idx - 1]) {
continue;
}
int left = idx + 1, right = numsSize - 1;
while (left < right) {
int total = nums[idx] + nums[left] + nums[right];
if (total == 0) {
if (*returnSize == capacity) {
capacity *= 2;
result = realloc(result, capacity * sizeof(int *));
*returnColumnSizes = realloc(*returnColumnSizes, capacity * sizeof(int));
}
int *triplet = malloc(3 * sizeof(int));
triplet[0] = nums[idx];
triplet[1] = nums[left];
triplet[2] = nums[right];
result[*returnSize] = triplet;
(*returnColumnSizes)[*returnSize] = 3;
(*returnSize)++;
left++;
right--;
while (left < right && nums[left] == nums[left - 1]) {
left++;
}
while (left < right && nums[right] == nums[right + 1]) {
right--;
}
} else if (total > 0) {
right--;
} else {
left++;
}
}
}
return result;
}
15_deduplicaton_checks.cpp
#include <algorithm>
#include <vector>
using namespace std;
class Solution {
public:
vector<vector<int>> threeSum(vector<int> &nums) {
vector<vector<int>> result;
sort(nums.begin(), nums.end());
for (int idx = 0; idx < nums.size(); idx++) {
if (idx > 0 && nums[idx] == nums[idx - 1])
continue; // skip duplicate fixed value
int i = idx + 1, j = nums.size() - 1;
while (i < j) {
int sum = nums[idx] + nums[i] + nums[j];
if (sum == 0) {
result.push_back({nums[idx], nums[i], nums[j]});
i++;
j--;
while (i < j && nums[i] == nums[i - 1])
i++; // skip duplicate left values
while (i < j && nums[j] == nums[j + 1])
j--; // skip duplicate right values
} else if (sum > 0) {
j--;
} else {
i++;
}
}
}
return result;
}
};
15_set_of_vectors.cpp
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
class Solution {
public:
vector<vector<int>> threeSum(vector<int> &nums) {
set<vector<int>> triplets;
sort(nums.begin(), nums.end());
for (int idx = 0; idx < nums.size(); idx++) {
int i = idx + 1, j = nums.size() - 1;
while (i < j) {
int sum = nums[idx] + nums[i] + nums[j];
if (sum == 0) {
triplets.insert({nums[idx], nums[i], nums[j]});
i++;
j--;
}
if (sum > 0)
j--;
if (sum < 0)
i++;
}
}
return vector<vector<int>>(triplets.begin(), triplets.end());
}
};
package main
import "sort"
func threeSum(nums []int) [][]int {
sort.Ints(nums)
result := [][]int{}
for idx := 0; idx < len(nums); idx++ {
if idx > 0 && nums[idx] == nums[idx-1] {
continue
}
left, right := idx+1, len(nums)-1
for left < right {
total := nums[idx] + nums[left] + nums[right]
if total == 0 {
result = append(result, []int{nums[idx], 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 total > 0 {
right--
} else {
left++
}
}
}
return result
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> result = new ArrayList<>();
for (int idx = 0; idx < nums.length; idx++) {
if (idx > 0 && nums[idx] == nums[idx - 1]) {
continue;
}
int left = idx + 1, right = nums.length - 1;
while (left < right) {
int total = nums[idx] + nums[left] + nums[right];
if (total == 0) {
result.add(Arrays.asList(nums[idx], 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 (total > 0) {
right--;
} else {
left++;
}
}
}
return result;
}
}
class Solution {
threeSum(nums) {
nums.sort((a, b) => a - b);
const result = [];
for (let idx = 0; idx < nums.length; idx++) {
if (idx > 0 && nums[idx] === nums[idx - 1]) continue;
let left = idx + 1;
let right = nums.length - 1;
while (left < right) {
const total = nums[idx] + nums[left] + nums[right];
if (total === 0) {
result.push([nums[idx], 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 (total > 0) {
right--;
} else {
left++;
}
}
}
return result;
}
}
class Solution:
def threeSum(self, nums: list[int]) -> list[list[int]]:
nums.sort()
result = []
for idx in range(len(nums)):
if idx > 0 and nums[idx] == nums[idx - 1]:
continue
left, right = idx + 1, len(nums) - 1
while left < right:
total = nums[idx] + nums[left] + nums[right]
if total == 0:
result.append([nums[idx], 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:
right -= 1
else:
left += 1
return result
struct Solution;
impl Solution {
fn three_sum(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
nums.sort();
let mut result = Vec::new();
let n = nums.len();
for idx in 0..n {
if idx > 0 && nums[idx] == nums[idx - 1] {
continue;
}
let mut left = idx + 1;
let mut right = n - 1;
while left < right {
let total = nums[idx] + nums[left] + nums[right];
if total == 0 {
result.push(vec![nums[idx], 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 total > 0 {
right -= 1;
} else {
left += 1;
}
}
}
result
}
}