21xrx.com
2024-11-23 08:42:01 Saturday
登录
文章检索 我的文章 写文章
两数之和——从暴力枚举到哈希表
2023-06-08 17:40:31 深夜i     --     --

正文

题目描述:

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

第一种方法:

最简单粗暴的方法就是暴力枚举,在数组中遍历每一个数字,在内部循环中查找目标元素。这样时间复杂度为O(n^2)。

代码如下:

class Solution {

public:

vector

vector

for (int i = 0; i < nums.size(); ++i) {

for (int j = i + 1; j < nums.size(); ++j) {

if (nums[i] + nums[j] == target) {

res[0] = i;

res[1] = j;

break;

}

}

}

return res;

}

};

第二种方法:

由于暴力枚举时间复杂度较高,所以考虑优化。一种可行的方法是使用哈希表(unordered_map)。采用哈希表存储已经遍历过的数的索引和值,如果目标值减去数组某个元素的差,在哈希表中已经存在,那么返回这个值的索引和已经存在的值的索引。

此时时间复杂度为O(n),因为只需要遍历一次数组。具体实现代码如下:

class Solution {

public:

vector

vector

unordered_map

for (int i = 0; i < nums.size(); ++i) {

if (m.count(target - nums[i])) {

res[0] = m[target - nums[i]];

res[1] = i;

break;

}

m[nums[i]] = i;

}

return res;

}

};

代码解释:

首先定义一个空的哈希表m和一个vector

总之,使用哈希表的方法在一定程度上增加了空间复杂度,但有效的降低了时间复杂度。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复