题目:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
你可以按任意顺序返回答案。
code:
class Solution{
public:
vector<int> twoSum(vector<int>& nums, int target){
unordered_map<int , int>hashtable;//定义哈希表
for(int i = 0; i < nums.size(); ++i){
auto it = hashtable.find(target - nums[i]);//auto为自动定义it的类型,这里是map的每一个pair,每个pair拥有value和key
if(it != hashtable.end()){//如果能找到,返回下标(这里要知道map中pair的first是key,second是value)
return(it->second, i);
}
hashtable[nums[i]] = i;//这里填充hash表,这样操作可以不用单独将数组全部填充到hash表中,nums是key,i是value
}
return{};
}
};
注意点:
1.for循环中的i++与++i:如果只是一条单独语句,没区别,比方说for(i=0;i<9;i++)与for(i=0;i<9;++i)都表示每次f0r循环结束时i+1后判断i是否<9再进入下一次循环。或者是循环内部的i++;及++i;也同理。但是对于数据量大的时候,++i的空间空间复杂度要小于i++,因为++i直接将i加1,而i++则需要开辟一个临时的变量来转存i。
但如果不是单独语句,就有区别:比如n=++i;和n=i++;n赋的值就不同,前者n的值为i,i再+1,后者n的值为+1后的i值。再有把一个数组的值赋到另一个数组中时,y[j++]=x[i];与y[++j]=x[i];也不同y数组开始储存的起点不同。