LeetCode 中的 3Sum 题目是一道经典的题目,在算法面试中经常被问到。这道题要求找出数组中所有的三个数,使得它们的和为0。例如,给定数组 [-1, 0, 1, 2, -1, -4],可以找到两个不重复的解:[-1, 0, 1] 和 [-1, -1, 2]。
为了解决这个问题,我们可以采用以下方法:
1. 排序数组:首先,我们需要将给定的数组按升序进行排序,这样方便后续的双指针操作。
2. 遍历数组:对于排序后的数组,我们用一个指针 i 遍历,从 0 开始一直到倒数第三个元素。为了避免重复解,在每次遍历时,如果当前的元素与前一个元素相同,我们就跳过,因为这样的解已经被考虑过了。
3. 双指针法:对于每个指针 i,我们使用双指针的方法来找到剩下两个数的解。我们将左指针设置为 i + 1,右指针设置为数组的最后一个元素。
4. 寻找和为 0 的组合:在双指针法中,我们计算当前三个数的和。如果和大于 0,则右指针向左移动;如果和小于 0,则左指针向右移动;如果和等于 0,则这是一个满足要求的组合,我们将其添加到结果中。然后,我们继续移动指针,直到左指针和右指针相遇为止。
下面是一个具体的实现示例:
```python
def threeSum(nums):
nums.sort() # 排序数组
res = []
n = len(nums)
for i in range(n-2):
if i > 0 and nums[i] == nums[i-1]: # 避免重复解
continue
left = i + 1
right = n - 1
while left < right:
s = nums[i] + nums[left] + nums[right]
if s < 0: # 当前和小于 0,左指针向右移动
left += 1
elif s > 0: # 当前和大于 0,右指针向左移动
right -= 1
else: # 当前和等于 0,添加到结果中,并移动指针
res.append([nums[i], nums[left], nums[right]])
left += 1
right -= 1
while left < right and nums[left] == nums[left-1]: # 避免重复解
left += 1
while left < right and nums[right] == nums[right+1]: # 避免重复解
right -= 1
return res
```
下面是一些测试用例和预期结果的示例:
```python
nums = [-1, 0, 1, 2, -1, -4]
print(threeSum(nums)) # 输出:[[-1, -1, 2], [-1, 0, 1]]
nums = [0, 0, 0]
print(threeSum(nums)) # 输出:[[0, 0, 0]]
```
这个算法的时间复杂度为 O(n^2),其中 n 是数组的长度。这是因为我们使用了两个嵌套的循环来遍历整个数组,并且在内部还有判断和指针移动的操作。由于数组已经排过序,所以排序的时间复杂度可以忽略不计。
总之,LeetCode 的 3Sum 题目是一道经典的题目,可以通过排序数组和双指针法来解决。这个算法具有很好的时间复杂度,并且在实际应用中也具有一定的价值。
壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。
我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!
发表评论 取消回复