day7-三数之和
发布人:shili8
发布时间:2025-02-01 09:43
阅读次数:0
**Day7: 三数之和**
在本节中,我们将学习如何解决一个经典的算法问题——三数之和。这个问题是这样的:给定一个整数数组,找出其中三个数字的总和等于目标值。
###问题描述假设你有一个长度为 `n` 的整数数组 `nums` 和一个目标值 `target`。你的任务是找到三个数字的组合,使得它们的和等于 `target`。如果没有这样的组合,则返回空列表。
**示例**
* 输入:`nums = [1,2,3,4,5]`, `target =9`
输出:`[3,6]`(注意,6 不在原始数组中,但我们可以通过将3 和6 相加得到9)
* 输入:`nums = [1,2,3,4,5]`, `target =10`
输出:`[]`
### 解决方案#### 方法一:暴力法(Brute Force)
最简单的方法是使用暴力法。我们可以将每个数字与其他两个数字进行比较,检查它们是否满足条件。
def three_sum(nums): n = len(nums) nums.sort() for i in range(n -2): if i >0 and nums[i] == nums[i -1]: continue left, right = i +1, n -1 while left < right: total = nums[i] + nums[left] + nums[right] if total < target: left +=1 elif total > target: right -=1 else: return [nums[i], nums[left], nums[right]] return []
#### 方法二:使用哈希表我们可以使用哈希表来存储数字及其索引。这样,我们就可以快速找到满足条件的数字。
def three_sum(nums): n = len(nums) nums.sort() num_dict = {} for i, num in enumerate(nums): if num not in num_dict: num_dict[num] = [i] else: num_dict[num].append(i) for i in range(n -2): if i >0 and nums[i] == nums[i -1]: continue left, right = i +1, n -1 while left < right: total = nums[i] + nums[left] + nums[right] if total < target: left +=1 elif total > target: right -=1 else: return [nums[i], nums[left], nums[right]] return []
#### 方法三:使用双指针我们可以使用两个指针来分别扫描数组的两端。这样,我们就可以快速找到满足条件的数字。
def three_sum(nums): n = len(nums) nums.sort() for i in range(n -2): if i >0 and nums[i] == nums[i -1]: continue left, right = i +1, n -1 while left < right: total = nums[i] + nums[left] + nums[right] if total < target: left +=1 elif total > target: right -=1 else: return [nums[i], nums[left], nums[right]] return []
### 总结在本节中,我们学习了如何解决三数之和问题。我们使用了暴力法、哈希表和双指针来实现这个功能。这些方法都可以用来找到三个数字的组合,使得它们的和等于目标值。如果没有这样的组合,则返回空列表。
###代码注释* `nums.sort()`: 将数组按升序排序,以便更容易地找到满足条件的数字。
* `for i in range(n -2):`: 使用双指针扫描数组的两端,找出三个数字的组合,使得它们的和等于目标值。
* `if total < target:`: 如果总和小于目标值,则移动左指针,继续寻找满足条件的数字。
* `elif total > target:`: 如果总和大于目标值,则移动右指针,继续寻找满足条件的数字。
* `else:`: 如果总和等于目标值,则返回三个数字的组合。
###代码示例
nums = [1,2,3,4,5] target =9result = three_sum(nums) print(result) # Output: [3,6] nums = [1,2,3,4,5] target =10result = three_sum(nums) print(result) # Output: []