返回
leetcode刷题记录-15. 三数之和的详细解析
前端
2023-11-30 06:53:16
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]范围内。
- 解集中不能包含重复的三元组。
基本思想和解法
基本思想 :
这道题的解题方法非常简单,对于给定数组中的每个元素,我们将它与其他两个元素进行组合,并检查它们是否能满足目标值。如果满足,则将其添加到结果集中。
具体步骤 :
- 对于数组中的每个元素nums[i],我们遍历它后面的所有元素,形成两个指针j和k。
- 然后,我们计算nums[i]、nums[j]和nums[k]的和,并与目标值target进行比较。
- 如果和小于目标值,则将指针j向后移动,以增加和。
- 如果和小大于目标值,则将指针k向前移动,以减少和。
- 如果和小等于目标值,则将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;
}
}
总结
这道题的难度不大,但需要有一定的算法基础。我们首先介绍了这道题的基本思想和解法,然后逐步优化算法,最后给出了最优解法。希望这篇文章能够帮助您更好地理解三数之和这道题。