题目描述:给定一个整数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们数组下标。提示:不能重复利用整数组中同样的元素。
第一种方法:暴力法
基本思路:假设nums数组中有n个先找到nums数组中的第一个整数,然后从第二个整数到第n个整数之中找到与第一个整数和为target的整数。如果找到了,返回两个数的数组下标。如果没找到,则先找到第二个整数,再从第三个整数到第n个整数之间找到与第二个整数和为target的整数,返回两个整数的下标。以此类推。
c++代码实现如下:
class Solution{
public:
vector<int>twoSum(vector<int>&nums,int target){
vector<int>res;
int s=nums.size();
int i,j;
for(i=0;i<s-1;i++){
for(j=i+1;j<s-1;j++){
if(nums[i]+nums[j]==target){
res.push_back(i);
res.push_back(j);
return res;}
}
}
return res;
}
};
第二种方法:利用hash表
基本思路:遍历数组nums,对每个nums[i],取得b=res-b[i],在hash表中寻找b,一旦找到,返回i和b在nums中的下标;如果没有找到,把b放到hash表里。
c++代码实现如下:
class solution{
public:
vector<int>twoSum(vector<int>&nums,int target){
unordered_map<int,int>hash;
vector<int>result;
int numsSize=int(nums.size());
for(int i=0;i<numsSize;i++){
int numberToFind=target-nums[i];
if(hash.find(numberToFind)!=hash.end()){
result.push_back(hash[numberToFind]);
result.push_back(i);
return result;
}
hash[nums[i]]=i;
}
return result;
}
};