题目
一、暴力法
采用两层for循环,遍历数组,对于每一个
n
u
m
s
[
i
]
nums[i]
nums[i]向后查找是否存在大小为
t
a
r
g
e
t
−
n
u
m
s
[
i
]
target-nums[i]
target−nums[i]的数。
双层for循环时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)
二、利用哈希表
1.思路
遍历所给
n
u
m
s
nums
nums,将已遍历过的存储到一个哈希表中,数组的元素存储为哈希表的键,该元素在数组中的位置存储为哈希表的值。对于每一个
n
u
m
s
[
i
]
nums[i]
nums[i]在哈希表中寻找是否存在
t
a
r
g
e
t
−
n
u
m
s
[
i
]
target-nums[i]
target−nums[i]的键。
利用哈希表进行寻找,每次查找的时间复杂度都是
O
(
1
)
O(1)
O(1),
2.代码实现
C++
class Solution {
public:
vector<int> twoSum(vector<int> &nums, int target) {
unordered_map<int, int> idx;
for (int i = 0;; i++) {
auto it = idx.find(target - nums[i]);
if (it != idx.end())
return {it->second, i};
idx[nums[i]] = i;
}
}
};
首先创建一个哈希表,遍历时利用find()函数查找是否存在 t a r g e t − n u m s [ i ] target-nums[i] target−nums[i]的键,若存在,返回键值对 i t it it对应的值和键;若不存在,将当前元素及其位置以键值对的形式存储到哈希表中。
python
class Solution:
def twoSum(self, nums, target):
hashtable = dict()
for i, num in enumerate(nums):
if target - num in hashtable:
return [hashtable[target - num], i]
hashtable[nums[i]] = i
return []
枚举获得数组元素 n u m num num及其位置 i i i,查找哈希表中的键是否存在 t a r g e t − n u m target-num target−num,循环此操作。
总结
利用哈希表的特性可以将每次查找的时间复杂度从 O ( n ) O(n) O(n)降低到 O ( 1 ) O(1) O(1)