概述
题干:
https://leetcode.cn/problems/two-sum/
1、暴力解法
找出所有两两配对,进行判断
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
if(nums.size() < 2){ throw "array's size is to small!";}
for (int i = 0; i < nums.size(); i++) {
for (int j = i + 1; j < nums.size(); j++) {
if (nums[i] + nums[j] == target) {
return vector<int>{i, j};
}
}
}
//没有return答案,抛出异常
throw "don't find";
}
};
2、哈希表查找
将问题转化为查找问题,然后使用哈希表,缩短了问题解决的时间。
算法:初始时哈希表为空。遍历数组,对每一个访问到的元素x,在哈希表中查找对应的target-x。找到了则返回答案,没有找到则将该元素x和其下标打包成pair插入到哈希表。
可行性分析:假设原来数组中有一对元素x,y符合要求,那么在我们的算法下,遍历数组。第一次遍历到其中一个元素时(设为x),由于另一个(y)没有被遍历到,也就不在哈希表中,我们查询哈希表就无法得到答案;但是当我们遍历到另一个元素(y)时,由于另一个配对元素(x)已经在哈希表中,我们一定会搜索哈希表得到答案。所以算法可行。
时间复杂度:主要是遍历数组 O(n)
空间复杂度:哈希表最多有nums.size()-1个元素(默认有答案的条件下),O(n)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
if(nums.size() < 2){ throw "array's size is to small!";}
unordered_map<int, int> hash_map; //用来查找的哈希表,初始为空
for (int i = 0; i < nums.size(); i++) {
//如果在哈希表中找到了,那么直接返回答案
if ( hash_map.find(target - nums[i]) != hash_map.end()) {
auto it = hash_map.find(target - nums[i]);
return vector<int>{i, it->second};
}
//如果没有找到,将数组中该元素值作为 key,下标作为 value 插入哈希表
else {
hash_map.insert(pair<int, int>{nums[i], i});
}
}
//遍历数组后仍然没有return答案,抛出异常(注意字符串字面量的类型为const char*,捕获异常时不要用string类型)
throw "don't find";
}
};
最后
以上就是默默钻石为你收集整理的1.两数之和(C++)的全部内容,希望文章能够帮你解决1.两数之和(C++)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复