返回

leetcode刷题记录-15. 三数之和的详细解析

前端

LeetCode第15题——三数之和

题意

给定一个整数数组nums,找出所有可能的三个数的组合,使得它们的和为给定的目标值target。

示例 1

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

示例 2

输入:nums = [], target = 0
输出:[]

示例 3

输入:nums = [0], target = 0
输出:[]

说明

  • 目标值target在[-10^9, 10^9]范围内。
  • 数组nums中所有元素的和在[-2^31, 2^31 - 1]范围内。
  • 解集中不能包含重复的三元组。

基本思想和解法

基本思想

这道题的解题方法非常简单,对于给定数组中的每个元素,我们将它与其他两个元素进行组合,并检查它们是否能满足目标值。如果满足,则将其添加到结果集中。

具体步骤

  1. 对于数组中的每个元素nums[i],我们遍历它后面的所有元素,形成两个指针j和k。
  2. 然后,我们计算nums[i]、nums[j]和nums[k]的和,并与目标值target进行比较。
  3. 如果和小于目标值,则将指针j向后移动,以增加和。
  4. 如果和小大于目标值,则将指针k向前移动,以减少和。
  5. 如果和小等于目标值,则将nums[i]、nums[j]和nums[k]添加到结果集中,并继续步骤1。

优化算法

优化1:排序数组

我们首先将数组排序,这样我们就可以在O(nlogn)的时间内遍历数组,而不是O(n^2)。

优化2:使用双指针

我们使用两个指针j和k来遍历数组,以查找与nums[i]组合能满足目标值的两个元素。我们从数组的末尾开始,并向中间移动指针j和k。这样,我们只需要遍历数组一次,就能找到所有可能的组合。

优化3:使用哈希表

我们还可以使用哈希表来存储数组中的元素。这样,我们就可以在O(1)的时间内查找是否存在与nums[i]组合能满足目标值的两个元素。

最优解法

代码

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

class Solution {
    public List<List<Integer>> threeSum(int[] nums, int target) {
        List<List<Integer>> result = new ArrayList<>();
        if (nums.length < 3) {
            return result;
        }
        Arrays.sort(nums);
        for (int i = 0; i < nums.length - 2; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            int j = i + 1;
            int k = nums.length - 1;
            while (j < k) {
                int sum = nums[i] + nums[j] + nums[k];
                if (sum == target) {
                    result.add(Arrays.asList(nums[i], nums[j], nums[k]));
                    while (j < k && nums[j] == nums[j + 1]) {
                        j++;
                    }
                    while (j < k && nums[k] == nums[k - 1]) {
                        k--;
                    }
                    j++;
                    k--;
                } else if (sum < target) {
                    j++;
                } else {
                    k--;
                }
            }
        }
        return result;
    }
}

总结

这道题的难度不大,但需要有一定的算法基础。我们首先介绍了这道题的基本思想和解法,然后逐步优化算法,最后给出了最优解法。希望这篇文章能够帮助您更好地理解三数之和这道题。