LeetCode mdash  mdash 15. 3Sum介绍

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内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。

我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!

点赞(18) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部