题目
给定一个整数数组 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)。