1.两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
初见此题,第一时间想到的是暴力
代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for (int i = 0; i < nums.size(); i++) {
for (int j = i + 1; j < nums.size(); j++) {
if (nums[i] + nums[j] == target) {
return {i, j};
}
}
}
return {};
}
};
注意:j从i+1开始遍历,遍历到最后i=nums.size()-1时,j超出nums.size()为空,若j也从i开始遍历,可能出现i==j,例如:target = 4,nums = [1,2,3]
得到i = 1,j = 1;即nums[i] == nums[j],此时nums[i] + nums[j] == target
最后为什么要return{}?
此函数的返回值类型为vector
分析:使用了嵌套循环,时间复杂度为O(n^2),
返回的vector
还能更快吗?
再看题目,找值,返回下标,把这两个结合在一起可以使用hash_map
代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> map;
for(int i=0;i<nums.size();i++){
auto t = map.find(target - nums[i]);
if(t != map.end()){
return {t->second,i};
}
map[nums[i]] = i;
}
return {};
}
};
注意:对t定义时使用auto,自适应
map[nums[i]] = i,让值作为键,直接存入map中,后续只需判断map中是否存在target-nums[i],节省时间
分析:
时间复杂度:hash_map查找的平均时间复杂度为O(1),插入操作 map[nums[i]] = i;的平均时间复杂度为O(n),使用一个for循环,时间复杂度为O(n),
空间复杂度:额外使用了一个hash_map,空间复杂度为O(n)
浙公网安备 33010602011771号