返回

LeetCode 刷题(1):双指针法巧解两数之和,轻松入门算法世界

前端

在 LeetCode 中,两数之和是一道经典的入门题,它要求我们在给定数组中找到两数之和等于指定目标值的组合。乍看之下,这似乎是一道简单的题目,但它却蕴含着许多算法的精髓。双指针法,一种在数组中寻找特定元素的有效技巧,将为你解决这道题提供一把利器。

双指针法的核心思想在于使用两个指针,一个指向数组的开头,另一个指向数组的结尾。然后,比较这两个指针指向的元素之和与目标值。如果两数之和等于目标值,那么就找到了所需要的组合。如果不是,则根据两数之和与目标值的比较结果,移动相应的指针,继续搜索。

这种方法的优势在于,它可以在线性时间内找到目标值,而不需要像暴力搜索那样遍历整个数组。这是因为双指针法只会在数组中移动两个指针,并且在每次移动指针之前都会对两数之和进行比较。这样可以大大减少不必要的搜索,从而提高算法的效率。

好了,现在我们来具体看看如何使用双指针法解决两数之和问题。首先,我们需要初始化两个指针,一个指向数组的开头,另一个指向数组的结尾。然后,比较这两个指针指向的元素之和与目标值。如果两数之和等于目标值,那么就找到了所需要的组合。如果不是,则根据两数之和与目标值的比较结果,移动相应的指针,继续搜索。

例如,对于数组 [2, 7, 11, 15] 和目标值 9,我们首先将两个指针指向数组的开头和结尾。比较这两个指针指向的元素之和 2 + 15 = 17 与目标值 9,发现不等于目标值。由于两数之和大于目标值,所以我们需要移动指向结尾的指针,将其指向数组的下一个元素。此时,两个指针指向的元素之和变为 7 + 15 = 22,仍然大于目标值。继续移动指向结尾的指针,直到它指向数组的最后一个元素。此时,两个指针指向的元素之和变为 2 + 11 = 13,仍然大于目标值。因此,没有满足条件的组合,返回空。

在实际编程中,可以使用循环来实现双指针法的搜索过程。具体实现方式如下:

def two_sum(nums, target):
  left = 0
  right = len(nums) - 1
  
  while left < right:
    sum = nums[left] + nums[right]
    if sum == target:
      return [left, right]
    elif sum < target:
      left += 1
    else:
      right -= 1
  
  return []

在这段代码中,left 和 right 分别指向数组的开头和结尾。使用 while 循环来遍历数组,每次比较两个指针指向的元素之和与目标值。如果两数之和等于目标值,则返回这两个指针对应的索引。如果两数之和小于目标值,则将左指针向右移动一位。如果两数之和大于目标值,则将右指针向左移动一位。这样循环下去,直到找到目标值或遍历完整个数组。

双指针法不仅适用于两数之和问题,它还可以用于解决许多其他类型的算法问题,例如三数之和、四数之和、最长连续子数组等。掌握了双指针法,将为你打开算法世界的大门,助你轻松应对各种算法挑战。

在接下来的文章中,我们将继续探索 LeetCode 中的经典算法问题,并为你提供详细的解题思路和代码实现。让我们一起携手前行,在算法的海洋中扬帆起航,成就属于自己的算法之旅。