📌  相关文章
📜  国际空间研究组织 | ISRO CS 2020 |问题 49(1)

📅  最后修改于: 2023-12-03 14:50:48.618000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2020 | 问题 49

题目:在给定的整数数组中,找到所有唯一的三个数字的组合,使得它们的和等于给定的目标值。

函数签名:List<List<int>> threeSum(int[] nums, int target)

输入

  • nums: 一个整数数组,长度不超过 3000。数组中的整数可能重复。
  • target: 目标值,一个整数。

输出

返回一个二维整数数组,数组中的每个元素都是一个长度为 3 的数组,表示一个唯一的三个数字的组合,使得它们的和等于给定的目标值。返回的二维数组中,每个三元组都必须是唯一的,不能重复。

如果没有满足条件的三元组,则返回一个空数组。

示例

输入
nums = [-1, 0, 1, 2, -1, -4]
target = 0
输出
[[-1, 0, 1], [-1, -1, 2]]

解题思路

这个问题可以转化为在数组中找到所有不重复的三个数字的组合,使得它们的和等于给定的目标值。

首先对数组进行排序,然后遍历数组中的每一个数字,将其作为当前的目标,然后在其后的数字中使用双指针法进行查找。

具体步骤如下:

  1. 对数组进行排序,可以使用快速排序或者归并排序等排序算法,时间复杂度为 O(nlogn)。
  2. 遍历数组中的每个数字:
    • 如果当前数字与前一个数字相同,跳过该数字,避免出现重复的三元组。
    • 使用双指针法在当前数字后面的子数组中查找满足条件的两个数字。
    • 如果找到满足条件的两个数字,则将它们和当前数字作为一个三元组添加到结果中。
  3. 返回结果数组。

代码实现

public List<List<int>> threeSum(int[] nums, int target) {
    List<List<int>> result = new ArrayList<>();

    Arrays.sort(nums);

    for (int i = 0; i < nums.length - 2; i++) {
        if (i == 0 || nums[i] != nums[i - 1]) {
            int left = i + 1;
            int right = nums.length - 1;
            int currentTarget = target - nums[i];

            while (left < right) {
                int sum = nums[left] + nums[right];
                if (sum == currentTarget) {
                    result.add(Arrays.asList(nums[i], nums[left], nums[right]));

                    while (left < right && nums[left] == nums[left + 1])
                        left++;

                    while (left < right && nums[right] == nums[right - 1])
                        right--;

                    left++;
                    right--;
                } else if (sum < currentTarget) {
                    left++;
                } else {
                    right--;
                }
            }
        }
    }

    return result;
}

该代码是使用 Java 编写的,在给定的整数数组中找到所有唯一的三个数字的组合,使得它们的和等于给定的目标值。它先对数组排序,然后通过双指针法在数组中查找满足条件的三个数字的组合。时间复杂度为 O(n^2)。