题目:给定一个数组nums,判断 nums 中是否存在三个元素
a,b,c,使得
a + b + c = target,找出所有满足条件且不重复的三元组合输入:nums: [5, 2, 1, 1, 3, 4, 6] ;target:8
输出: [ [1, 1, 6], [1, 2, 5], [1, 3, 4] ]
JS版本
const threeSum = (nums, target) => {
nums.sort((a, b) => a - b);
const result = [];
for (let i = 0; i < nums.length - 2; i++) {
if (i > 0 && nums[i] === nums[i - 1]) {
continue;
}
let left = i + 1;
let right = nums.length - 1;
while (left < right) {
const currentSum = nums[i] + nums[left] + nums[right];
if (currentSum === target) {
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 (currentSum < target) {
left++;
} else {
right--;
}
}
}
return result;
};
const nums = [5, 2, 1, 1, 3, 4, 6];
const target = 8;
console.log(threeSum(nums, target));
Java版本
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
int[] nums = {5, 2, 1, 1, 3, 4, 6};
int target = 8;
List<List<Integer>> result = threeSum(nums, target);
System.out.println(result);
}
public static List<List<Integer>> threeSum(int[] nums, int target) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length - 2; i++) {
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
int left = i + 1;
int right = nums.length - 1;
while (left < right) {
int currentSum = nums[i] + nums[left] + nums[right];
if (currentSum == target) {
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 (currentSum < target) {
left++;
} else {
right--;
}
}
}
return result;
}
}
C#版本
using System;
using System.Collections.Generic;
class Program
{
static List<List<int>> ThreeSum(int[] nums, int target)
{
List<List<int>> result = new List<List<int>>();
Array.Sort(nums);
for (int i = 0; i < nums.Length - 2; i++)
{
if (i > 0 && nums[i] == nums[i - 1])
{
continue;
}
int left = i + 1;
int right = nums.Length - 1;
while (left < right)
{
int currentSum = nums[i] + nums[left] + nums[right];
if (currentSum == target)
{
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 (currentSum < target)
{
left++;
}
else
{
right--;
}
}
}
return result;
}
static void Main(string[] args)
{
int[] nums = { 5, 2, 1, 1, 3, 4, 6 };
int target = 8;
List<List<int>> result = ThreeSum(nums, target);
Console.WriteLine(result);
}
}
Go版本
package main
import (
"fmt"
"sort"
)
func main() {
nums := []int{5, 2, 1, 1, 3, 4, 6}
target := 8
result := threeSum(nums, target)
fmt.Println(result)
}
func threeSum(nums []int, target int) [][]int {
result := [][]int{}
sort.Ints(nums)
for i := 0; i < len(nums)-2; i++ {
if i > 0 && nums[i] == nums[i-1] {
continue
}
left, right := i+1, len(nums)-1
for left < right {
currentSum := nums[i] + nums[left] + nums[right]
if currentSum == target {
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 currentSum < target {
left++
} else {
right--
}
}
}
return result
}
Python版本
def three_sum(nums, target):
nums.sort()
result = []
for i in range(len(nums) - 2):
if i > 0 and nums[i] == nums[i - 1]:
continue
left = i + 1
right = len(nums) - 1
while left < right:
current_sum = nums[i] + nums[left] + nums[right]
if current_sum == target:
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 current_sum < target:
left += 1
else:
right -= 1
return result
nums = [5, 2, 1, 1, 3, 4, 6]
target = 8
print(three_sum(nums, target))