力扣hot100——1.两数之和
题目链接:1. 两数之和 - 力扣(LeetCode)
题目概述: 在一个数组中找到两个不同的元素使得和为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 {};
}
};
- 时间复杂度:O(n 2) ,n为数组长度
- 空间复杂度:O(1)
哈希表解法
用unordered_map存放遍历过的元素,遍历数组的时候查询unordered_map是否出现某个元素与之相加等于target。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> num_set;
for(int i=0;i<nums.size();i++){
auto temp=num_set.find(target-nums[i]);
if(temp!=num_set.end()){//找到符合条件的
return {i,temp->second}; //返回数组下标
}
else{//没找到
num_set.insert({nums[i],i}); //插入目前遍历的元素
}
}
return {};
}
};
- 时间复杂度:O (n)
- 空间复杂度:O (n) 哈希表的存储空间
一些思考
为什么哈希表解法的效率更高
哈希表解法可以看作是对暴力解法的优化,暴力解法第一层for循环依次枚举各个数,第二层for循环再遍历一遍数组,寻找能够与第一次for循环所枚举的数相匹配的元素(两个相加等于target),相当于用O(n)的时间寻找对应的元素;对于哈希表来说,哈希表的查询效率是O(1),相当于用O(1)的时间寻找对应的元素。

浙公网安备 33010602011771号