练习地址:力扣
分析:首先,如果用暴力做法,使用两层for循环,第一层一 一列举vector中的每一个数,第二层将每一个数再次与数组中的每一个数进行一 一比对,如果拼凑结果成功则返回两个坐标。这种做法的时间复杂度为O(N^2).我们可以考虑用散列表一次 进行一次扫描,每扫描一个数都对hash使用O(1)的算法查找一次hash里有没有已经可以凑成结果的数存进去了,如果有则输出,没有的话则将当前扫描到的这个数映射到hash里.
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int>hash; //创建一个hash表
for(int i=0;i<nums.size();i++)
{
int x=target-nums[i]; //求当前数凑成结果需要的匹配数
if(hash.count(x)) //如果当前数的匹配数在hash表中已经找到了,则为真
return {hash[x],i}; //返回结果
hash[nums[i]]=i;; //如果没找到则把当前数映射到hash中 注意映射下标为原数组的值,因为题目要求返回的是vector下标
}
return {};
}
};
这种做法的时间复杂度仅有O(N);