題目
給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那 兩個 整數,并返回它們的數組下標。
你可以假設每種輸入只會對應一個答案,并且你不能使用兩次相同的元素。
你可以按任意順序返回答案。
示例 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
只會存在一個有效答案
進階:你可以想出一個時間復雜度小于 O(n2) 的算法嗎?
題目
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {int n = nums.size();for(int i = 0;i < n;i++){for(int j = i+1;j < n;j++){if(nums[i]+nums[j] == target){return {i,j};}}}return {};}
};
方法二
哈希表
class Solution {
public:// 兩數之和解法:哈希表優化查找vector<int> twoSum(vector<int>& nums, int target) {// 哈希表:鍵為數組中的數值,值為該數值對應的索引(用于快速查找)unordered_map<int, int> hashtable; // 存儲已遍歷過的元素信息// 遍歷數組,i為當前元素的索引for (int i = 0; i < nums.size(); ++i) {// 計算當前元素需要的"互補數"(即target - 當前數)int complement = target - nums[i];// 在哈希表中查找是否存在該互補數auto it = hashtable.find(complement); // it是查找結果的迭代器// 若找到互補數(it不等于哈希表尾后迭代器)if (it != hashtable.end()) {// 返回互補數的索引(it->second)和當前元素的索引ireturn {it->second, i};}hashtable[nums[i]] = i;}return {};}
};
假設 nums = [2, 7, 11, 15],target = 9:
遍歷第一個元素(i=0,值為 2):
計算 target - 2 = 7,哈希表為空,未找到。
將 2:0 存入哈希表。
遍歷第二個元素(i=1,值為 7):
計算 target -7 = 2,在哈希表中找到鍵為 2(對應索引 0)。
返回 [0, 1](即 2+7=9)。