题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
leetcode链接: 两数之和
题解一:
1.还是使用常规的暴力for循环方法,时间复杂度是O(n^2)。
2.需要注意的是第二个for循环的起始位置是i+1,因为不能重复加自己本身,需要从i+1个开始相加
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int sum = 0;
vector<int> record;
for(int i=0;i<nums.size();i++){
for(int j=i+1;j<nums.size();j++){
sum = nums[i]+ nums[j];
if(sum == target){
return {i,j};
}
}
}
return {};
}
};
题解二:使用哈希表来
1.将时间复杂度缩小为O(n),与快乐数那道题的原理是一样的,关键在于这条代码 if (num_map.find(complement) != num_map.end())
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> num_map; // 存储 {数值: 索引}
for (int i = 0; i < nums.size(); i++) {
int complement = target - nums[i];
if (num_map.find(complement) != num_map.end()) {
return {num_map[complement], i}; // 找到答案
}
num_map[nums[i]] = i; // 存入当前数字
}
return {};
}
};
总结
1.刷算法题的精髓在于去打开你的思维,刷了几道哈希表的题之后发现,对哈希表有个更进一步的认识,千万不能只是看,一定要动手
2.虽然现在还是总是会想着用暴力for循环,但是对哈希表有了更进一步的认识,后面刷题的时候就会想着去用哈希表解题了