1、題目
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,并返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。
2、思考分析
雙for循環的時間復雜度O(n^2),而哈希法的時間復雜度為O(1),所以哈希法顯然更有效。
這里我們使用map而不使用set、或者自構造數組。
數組與set的局限:
1、數組大小受到限制,如果元素較少,而哈希值太大會造成內存空間浪費
2、set是一個集合,里面放的元素只能是一個key,不能知道key所在的位置,也就是說我們只能知道key是否存在。
而這一題不經要判斷y是否存在還要疾苦y的下標。
3、使用map可以同時保存key、value,類似于數組。我們可以用key保存數值,用value保存數值所在下標。
C++中map的有關用法可以參考這篇筆記:STL容器及其簡單應用
這里我們選擇unordered_map;
需要注意map.insert函數的用法;
map.insert(pair<int, int> (nums[i], i));
3、哈希法
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {int n = nums.size();unordered_map<int,int> map;for(int i=0;i<n;i++){auto iter = map.find(target-nums[i]); //觀察是否找到另外一個數//如果找到了if(iter !=map.end()){//iter.first:key iter.second:下標return {i,iter->second};}map.insert(pair<int, int> (nums[i], i));}return {};}
};