1. Two Sum

“我有n个数字的列表,里面有且仅有两个数之和等于m,我要知道这两个数字在哪。”
这就是LeetCode中”Hello World”级别的问题所要解决的事情。
用最简单的思路,我们可以这么做:
  1. 拿起第 1 个数字,看它后面的数字和它相加是否等于 , 如果存在这个数字,问题解决;
  1. 拿起第 2 个数字,看它后面的数字和它相加是否等于 , 如果存在这个数字,问题解决;(注意,我们都只看后面的数字,因为前面的数字我们已经检查过了)
  1. … 拿起第 个数字,看它后面的数字和它相加是否等于 , 如果存在这个数字,问题解决;
我们需要遍历一遍这个列表,找到每个元素后面是否存在一个数字和它相加等于 .
这样做听起来很合理,但是复杂度其实是 . 因为对于遍历的第 个元素,我们要检查第 个元素中是否有和第 个元素相加等于 的数字。 所以最坏情下,算法复杂度估计如下:
我们能让算法更快吗?
—— “用空间换时间”
列表里面的每个元素必须遍历一遍,那么我们的思路就应该是在找符合条件的数字的时候,减少重复开销。