LeetCode 1. 两数之和
算法就是解题方案的准确而完整的描述,是一系列解决问题的清晰指令。一些大厂经常会考察面试者算法能力,观察面试者编码的熟练程度、思考的速度和深度,以此衡量面试者的能力和潜力,所以算法重要性不言而喻。想进大厂,就必须拿下算法,而算法学习,就是要不断地练习。为了帮助大家提升算法能力,我将带大家每天做一道算法题!
今天的题目是两数之和(Two Sum),这是 LeetCode 上的第一题,刷题的敲门砖。
有人相爱,有人夜里开车看海,有人 LeetCode 第一题都做不出来。
题目描述
1 | /** |
题解
方法一:暴力枚举
思路及算法
最容易想到的方法是枚举数组中的每一个数 x,寻找数组中是否存在 target - x。
当我们使用遍历整个数组的方式寻找 target - x 时,需要注意到每一个位于 x 之前的元素都已经和 x 匹配过,因此不需要再进行匹配。而每一个元素不能被使用两次,所以我们只需要在 x 后面的元素中寻找 target - x。
1 | class Solution { |
复杂度分析
时间复杂度:O(N^2),其中 N 是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。
空间复杂度:O(1)。
方法二:哈希表
思路及算法
注意到方法一的时间复杂度较高的原因是寻找 target - x 的时间复杂度过高。因此,我们需要一种更优秀的方法,能够快速寻找数组中是否存在目标元素。如果存在,我们需要找出它的索引。
使用哈希表,可以将寻找 target - x 的时间复杂度降低到从 O(N) 降低到 O(1)。
这样我们创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配。
1 | class Solution { |
复杂度分析
时间复杂度:O(N),其中 N 是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x。
空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。
好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力。