题目描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
1.双指针法
1.1代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
//(1)对副本排序
vector<int> nums_temp = nums;
sort(nums_temp.begin(), nums_temp.end());
int size = nums.size();
//(2)查找和为target的两个元素
int i = 0, j = size-1,num;
while (i!=j)
{
num = nums_temp[i] + nums_temp[j];
if (num > target)
j--;
else if (num < target)
i++;
else
break;
}
//(3)查找nums中两个元素对应的下标
vector<int> res;
for (int m = 0; m < size; m++)
{
if (nums[m] == nums_temp[i])
res.push_back(m);
else if (nums[m] == nums_temp[j])
res.push_back(m);
}
return res;
}
};
1.2思路
(1)复制一份nums给nums_temp,并对nums_temp排序
(2)i和j分别指向nums_temp头和尾,l两个指针向内部移动,总能找到nums_temp[i]+nums_temp[j]=target
(3)遍历nums,寻找nums[m]等于nums_temp[i]以及nums_temp[j]时的下标m,即为所求。
1.3示例带入
比如nums=[3,2,4],target=6
步骤(1):nums_temp=[2,3,4]
步骤(2):i=0,j=2,nums_temp[0]=2,nums_temp[2]=4
步骤(3):nums[1]=nums_temp[0],nums[2]=nums_temp[2],[1,2]即为所求。
2.哈希表法
2.1代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
//(1)创建mymap,键为nums[i],值为i
vector<int> res;
unordered_map<int, int> mymap;
for (int i = 0; i < nums.size(); i++)
mymap[nums[i]] = i;
//(2)查找索引
int temp;
for (int i = 0; i < nums.size(); i++){
temp=target-nums[i];
if (mymap.count(temp) && i != mymap[temp]) {
res.push_back(i);
res.push_back(mymap[temp]);
break;
}
}
return res;
}
};
2.1思路
(1)nums[i]作为mymap的键,索引i作为mymap的值。
(2)遍历,如果target-nums[i]的值在mymap(即nums中)
,并且其对应的索引!=i,则找到所求。
2.2示例带入
比如nums=[3,2,4],target=6
步骤(1):mymap[3]=0,mymap[2]=1,mymap[4]=2
步骤(2):i=0时,6-3=3,3在mymap中但mymap[3]与当前索引0相同,所以不满足条件;
i=1时,6-2=4,4在mymap中,且mymap[4]与当前索引1不等,所以找到所求,即[i,mymap[4]]