這道題之前刷代碼隨想錄的時候已經刷過好幾遍了,看到就直接秒了。這道題主要是通過unordered_map<int, int>
來建立哈希表,其中鍵用來保存向量中的元素,而對應的值則為元素的下標。遍歷整個向量,當遍歷到nums[i]時,立馬檢查target-nums[i]
是否在哈希表中,如果在,直接返回哈希表中對應鍵的值和當前遍歷到的元素下標,如果不在,就直接將{nums[i], i}作為鍵值對添加到哈希表中。
特別要注意的是,這道題不需要額外考慮相加為target的兩個數為同一位置的數,這種情況不可能發生。因為當第一次遍歷到這個數時,哈希表中還沒有存儲該數,所以第一次遍歷到它時會直接將其添加到哈希表中,當第二次遍歷到大小相同的值時,由于哈希表中存儲的是上一個相同值的下標,一定不可能是當前元素的下標,所以這種情況無需考慮。
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hash;for(int i = 0; i < nums.size(); i++){auto it = hash.find(target - nums[i]);if(it != hash.end())//找到和為target的兩個數且這兩個數一定不是同一個位置上的數return {i, it -> second};elsehash[nums[i]] = i;}return {};}
};