20.06.08 LeetCode01. 两数之和
引言:
近日刷LeetCode用到unordered_map容器,由于第一次接触,故学习之并记录。后面附上LeetCode原题与题解
unordered_map:
unordered_map是C++中的哈希表,可以在任意类型与类型之间做映射。unordered_map内部元素是无序的。它的底层是一个防冗余的哈希表(开链法避免地址冲突)。哈希表的数据存储和查找消耗时间复杂度仅为O(1),其缺点是需要占用比较多的内存。
具体用法可转博文:https://blog.csdn.net/jingyi130705008/article/details/82633778
LeetCode原题:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
思路一:暴力求解(此处省略此种方法)
思路二:
两数之和为target,当确定其中一个数为nums[i]时,另外一个数也必为target-nums[i]。利用C++的unordered_map容器实例化一个map,将数组的值映射为其下标,遍历数组,如果目标值target-nums[i]的映射存在,证明nums[i]和target-nums[i]的映射同时存在,此时返回target-nums[i]的映射和当前遍历到的下标次数,否则将当前数组值nums[i]与下标i通过map映射。
代码:
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 unordered_map<int,int>map; 5 for(int i = 0;i<nums.size();i++) 6 { 7 if(map.count(target-nums[i])==1)//count()判断map里是否存在该值 8 return {map[target-nums[i]],i}; 9 map[nums[i]]=i; 10 } 11 return {}; 12 13 } 14 };