实现三数之和 Java

问题描述

我们需要实现一个函数,该函数将找到数组中所有唯一的三元组,使得它们的和为0。我们可以假设给定的数组包含至少3个元素,并且元素互不相同。

例如,给定数组 nums = [-1, 0, 1, 2, -1, -4],我们需要找到所有满足条件的三元组:[ [-1, 0, 1], [-1, -1, 2] ]

解决方案

为了解决这个问题,我们可以使用两个指针的方法。首先,我们对数组进行排序,然后依次遍历数组中的每个元素。对于遍历到的元素 nums[i],我们使用两个指针 leftright 来查找满足条件的三元组。

我们将指针 left 初始化为 i+1,指针 right 初始化为数组的末尾。然后,我们进入一个循环,直到指针 leftright 相遇为止。在每一次循环中,我们计算 nums[i] + nums[left] + nums[right] 的值,并根据这个值来移动指针 leftright

如果计算得到的值小于0,则说明三个数之和太小,我们需要将 left 指针向右移动一位。如果计算得到的值大于0,则说明三个数之和太大,我们需要将 right 指针向左移动一位。如果计算得到的值等于0,则说明找到了一个满足条件的三元组,我们将这个三元组加入结果集。然后,我们继续移动指针 leftright,直到它们相遇为止。

下面是整个流程的步骤表格:

步骤 动作
1 对数组进行排序
2 初始化指针 i 为0
3 循环遍历 i 从0到 n-2 的所有值
4 初始化指针 lefti+1,指针 rightn-1
5 循环 left 不超过 right
6 计算 nums[i] + nums[left] + nums[right] 的值
7 如果和小于0,将 left 指针向右移动一位
8 如果和大于0,将 right 指针向左移动一位
9 如果和等于0,将三元组加入结果集
10 继续移动指针 leftright 直到相遇
11 i 增加1,重复步骤3-10,直到 i 超过 n-2

下面是具体的实现代码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ThreeSum {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();

        Arrays.sort(nums); // 步骤1:对数组进行排序

        for (int i = 0; i < nums.length - 2; i++) { // 步骤3:循环遍历 i 从 0 到 n-2 的所有值
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue; // 跳过重复的元素
            }

            int left = i + 1; // 步骤4:初始化指针 left 为 i+1
            int right = nums.length - 1; // 步骤4:初始化指针 right 为 n-1

            while (left < right) { // 步骤5:循环 left 不超过 right
                int sum = nums[i] + nums[left] + nums[right]; // 步骤6:计算三个数之和的值

                if (sum < 0) { // 步骤7:如果和小于0,将 left 指针向右移动一位
                    left++;
                } else if (sum > 0) { // 步骤8:如果和大于0,将 right 指针