什么,你只会用JS写三数之和?现在是全栈开发时代啦

90 阅读1分钟

题目:给定一个数组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)-1for 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))