01两数之和(哈希表)
給定一個整數(shù)數(shù)組 nums 和一個整數(shù)目標值 target,請你在該數(shù)組中找出 和為目標值 target 的那 兩個 整數(shù),并返回它們的數(shù)組下標。
你可以假設(shè)每種輸入只會對應(yīng)一個答案。但是,數(shù)組中同一個元素在答案里不能重復(fù)出現(xiàn)。
你可以按任意順序返回答案。
示例 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 只會存在一個有效答案
進階:你可以想出一個時間復(fù)雜度小于 O(n2) 的算法嗎?
這是力扣上的第一道題目,一看題目就很輕易想到暴力解法,直接兩個for循環(huán)帶走;時間復(fù)雜度為O(n^2),空間復(fù)雜度為O(n);
而這里我們來說一下如何用哈希表讓時間復(fù)雜度降為O(n);
因為題目要求返回下表,所以可以想到用map容器,將nums[i]作為key索引,下表 i 作為value值;當然這里用unordered_map更好,因為它的效率比map更高;
思路很簡單的,當然如果對哈希表不熟悉的話可能不太容易想到,多多練習就好了;
代碼如下:
class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map <int,int> hash;for (int i = 0; i < nums.size(); ++i) {//find返回的是迭代器,這里auto相當于unordered_map<int, int>::iteratorauto it = hash.find(target - nums[i]);if (it != hash.end()) {return {it -> second, i};}hash.insert(pair<int, int>(nums[i], i));//插入操作}return {};} };時間復(fù)雜度O(n),空間復(fù)雜度O(n);
總結(jié)
以上是生活随笔為你收集整理的01两数之和(哈希表)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: set/multiset/unorder
- 下一篇: 49字母异位词分组(哈希表)