开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情
Day37 2023/02/12
难度:简单
题目
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例1
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]
示例2
输入: nums = [3,2,4], target = 6
输出: [1,2]
思路
本题只需要在遍历数组的时候,向map中查询是否有和目前遍历元素匹配的数值,如果有,就找到匹配对,没有就把当前遍历元素放入map中,因为map存放的就是我们访问过的元素。
具体步骤:
- 创建辅助map,遍历数组。
- 向map中查询是否存在与当前遍历元素匹配的数,如果有的话就返回两数下标,没有则返回空数组。
关键点
- map中key存储元素值,value存储下标。
- map具有随机存取的性质,所以find函数的时间复杂度为O(1)。
- iter->first和iter->second分别指向map中的key值和value值。
算法实现
c++代码实现-哈希法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map <int,int> map;//辅助map
for(int i = 0; i < nums.size(); i++) {
// 遍历当前元素,并在map中寻找是否有匹配的key
auto iter = map.find(target - nums[i]);
if(iter != map.end()) return {iter->second, i};
// 如果没找到匹配对,就把访问过的元素和下标加入到map中
else map[nums[i]] = i;
}
return {}; //否则返回空数组
}
};
- 时间复杂度 ---遍历数组全部元素,其中n为数组长度
- 空间复杂度 --- 最坏情况下数组中不存在这样的两个数,则map中存储全部n个数组元素
总结
- 本题呢就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。那么我们就应该想到使用哈希法了,因为本地,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适。