🎈个人主页:算法诗人
✨收录专栏:算法诗人Leetcode揭秘之旅
🎉欢迎 👍点赞✍评论⭐收藏
🤝希望我的文章能对你们有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗
文章目录
Leetcode题目链接
一、题目描述
给定一个整数数组 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]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
二、解题思路
这道题当然最直接的方法就是用两个for循环去找到这两个整数和它们的下标,时间复杂度则为O(n^2)。
有没有一种方法能够减小时间复杂度呢?我们首先来分析一下这道题,首先肯定是有一个循环去遍历整个数组作为第一个加数,我们要减少时间复杂度可以在第二个加数的寻找上想办法。
之前我们讲到了要从一个数组里面快速找到某个数是否存在可以考虑用哈希表,这道题就会用到哈希表中的unordered_map,为什么是map而不是set呢?因为我们这里不仅要返回那两个整数,也要返回它们的数组下标,而map的数据结构正好是一个key和一个value,这里我们用value来存下标,key来存整数的值。
在unordered_map中key是唯一的,value可以不唯一,在其他地方运用时需要注意到,本题不影响。
编程思路如下:
- 我们通过target减去当前遍历的数组值来计算出在map中寻找的值。
- 在map中去寻找这个值,如果找到了则返回这个值的下标和当前遍历的数组值的下标,如果没有找到则把当前遍历的数组的值和下标都储存在map中。
- 不断重复前两步,直到找到一组相加等于target的数组值,并返回它们的下标。(因为本题的输入一定会对应一个答案,所以不需要考虑找不到匹配的两个值的情况。)
上述的方法要在遍历到第二个能够匹配的加数之后,返回去寻找map中已经出现过的第一个加数。为什么不能把输入数组的值一开始就全部复制到一个新的map中去,然后在第一个加数遍历到的时候就能直接找到第二个匹配的值了呢?
因为如果是两个相等的数相加等于target的话这样就会发生错误,会返回两个相同的下标,因为在寻找第二个值的时候没有排除掉第一个值本身。
比如 输入:nums = [3,3], target = 6。输出将会是[0,0]。
三、示例代码
class Solution {
public:
vector<