哈希表--两数之和
? ? ? 題目描述:
? ? ? 給定一個(gè)整數(shù)數(shù)組 nums 和一個(gè)目標(biāo)值 target,請(qǐng)你在該數(shù)組中找出和為目標(biāo)值的那 兩個(gè) 整數(shù),并返回他們的數(shù)組下標(biāo)。
? ? ?你可以假設(shè)每種輸入只會(huì)對(duì)應(yīng)一個(gè)答案。但是,你不能重復(fù)利用這個(gè)數(shù)組中同樣的元素。
? ? ?示例:
? ? ?給定 nums = [2, 7, 11, 15], target = 9
? ? ?因?yàn)?nums[0] + nums[1] = 2 + 7 = 9
? ? ?所以返回 [0, 1]
?
? ? ?暴力解法就是用2層for循環(huán),下面看下哈希表的解法:
#include <iostream> #include <vector> #include<unordered_map>using namespace std;class Solution { public:vector<int> twoSum1(vector<int>& nums, int target) {//方法1:兩遍哈希vector<int> res;if(nums.size() < 2)return res;//數(shù)組中至少有兩個(gè)數(shù)時(shí),創(chuàng)建哈希表的key-valueunordered_map<int,int> mymap;for(auto i = 0;i < nums.size();i++){//將值作為hash表的下標(biāo)mymap[nums[i]] = i;//值-下標(biāo)}//查找for(auto i = 0;i < nums.size();i++){int temp = target - nums[i];unordered_map<int,int>::iterator iter = mymap.find(temp);//保證不是同一個(gè)數(shù)重復(fù)利用if(iter != mymap.end() && iter->second != i){res.push_back(i);res.push_back(iter->second);break;}}return res;}vector<int> twoSum2(vector<int>& nums, int target) {//方法2:一遍哈希vector<int> res;if(nums.size() < 2)return res;//數(shù)組中至少有兩個(gè)數(shù),創(chuàng)建哈希表unordered_map<int,int> mymap;unordered_map<int,int>::iterator iter;for(auto i = 0;i < nums.size();i++){int temp = target - nums[i];//要找的那個(gè)值iter = mymap.find(temp);if(iter != mymap.end()){res.push_back(iter->second);res.push_back(i);break;}//沒(méi)找到mymap[nums[i]] = i;//值-下標(biāo)}return res;} };? ?哈希表鍵存儲(chǔ)數(shù)組的值,哈希表值存儲(chǔ)數(shù)組的下標(biāo)。
?
代碼地址:https://leetcode-cn.com/problems/two-sum/solution/ha-xi-biao-by-jian-yi-9-2
總結(jié)
- 上一篇: 求字符串中最长无重复子序列
- 下一篇: 动态规划-最长回文子串