返回

每日算法挑战---两数之和,LeetCode上的人气面试题

前端

生活中的许多事情都与求和有关,重量相加达到某个数值,就是我们生活中的“两数之和”,但是在计算机世界中,“两数之和”却又是计算机与人的区别,人可以一眼看出两个数加起来是多少,而计算机却需要编程才能识别。

LeetCode题库中有一道题,编号是“1”,被称为“两数之和”。这题的很简单:“给你一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的两个整数,并返回它们的数组下标。”

LeetCode是一个在线算法题库,在程序员中享有盛誉,很多公司会在面试中用到LeetCode题库中的题目。因此,LeetCode题库中的题目,值得每一个想学习编程,以及想要在计算机行业工作的人认真研究。

从暴力枚举到双指针

“两数之和”乍一看似乎很简单,暴力破解的办法就是,选定一个数字,然后尝试与后面的数字相加,如果等于目标值,则输出,否则继续尝试,直到找到两数之和等于目标值为止。这种方法虽然简单,但是效率极低,如果数组中数字较多,那么这种方式的时间复杂度就可能变成O(N^2)。

一种更有效的方法是双指针。双指针法,顾名思义,是使用两个指针来遍历数组。将两个指针分别初始化为数组的首部和尾部,然后同时移动两个指针。如果当前位置的和大于目标值,则尾指针左移;如果当前位置的和小于目标值,则首指针右移。如此循环,直到找到目标值。这种方法的时间复杂度为O(N),效率比暴力枚举高得多。

Python实现

def two_sum(nums, target):
  """
  :type nums: List[int]
  :type target: int
  :rtype: List[int]
  """
  # 将数组中的数字与索引值对应起来
  num_index_dict = {}
  for i, num in enumerate(nums):
    # 如果目标值减去当前数字的值在字典中,说明找到了一对和为目标值的数字
    if target - num in num_index_dict:
      return [num_index_dict[target - num], i]
    # 将当前数字及其索引值存入字典中
    num_index_dict[num] = i

  return []

# 测试
nums = [2, 7, 11, 15]
target = 9
print(two_sum(nums, target))  # 输出:[0, 1]

结语

“两数之和”是LeetCode题库中非常受欢迎的入门题目之一。通过双指针的方式,可以快速找出数字和为某一个值的两个数字的索引,这在密码学、股票配对、气象学中都可以运用。希望本文对你有帮助。