杂记杂记,顾名思义,就是把在我个人做题中用到的vector相关知识记录一下。我比较笨只能用这种方法,不然记不住
相关题目
力扣1.两数之和
思路
两种思路,一个是暴力枚举,一个是用哈希表
1️⃣暴力枚举
看到这个第一反应想到的是暴力枚举,作为一道力扣简单题,暴力枚举是可行的(但后面三数之后及以上就不行了)
看看这两段代码
//通过
int i, j;
bool find = false;
for(i = 0; i < nums.size() - 1; i++){
for(j = i + 1; j < nums.size() - 1; j++){
cout << i << ' ' << j << endl;
if(nums[i] + nums[j] == target){
find = true;
break;
}
}
if(find) break;
}
//错误
int i, j;
for(i = 0; i < nums.size() - 1; i++){
for(j = i + 1; j < nums.size() - 1; j++){
cout << i << ' ' << j << endl;
if(nums[i] + nums[j] == target) break;
}
}
下面那段错的原因是循环中的break只能跳出一个,也就是内循环跳过之后外循环还会运行,我之前一直以为break是全部跳出,受到了刷新三观级别的冲击了属于是
用到的函数:nums.size()获取动态数组(网上也称之为向量)
小总结:时间复杂度为O(n^2)开销来自双重for循环,空间复杂度为O(1);运行时间慢且内存空间消耗大
2️⃣哈希表
通过unordered_map构建哈希表。哈希表的特点就是空间换时间,通过消耗更多的内存换来更快的数据存储和查找。unordered_mao与map相比是无序的,所以有更快的查找速度,但构建哈希表就比较耗时
unordered_map <int, int> hashtable;
for(int i = 0; i < nums.size(); i++){
auto it = hashtable.find(target - nums[i]);
if(it != hashtable.end()) cout << it->second << ' ' << i << endl;
hashtable[nums[i]] = i;
}
存储nums[i]和i,nums[i]为key且i为value,通过哈希表看是否能查找到key为target-nums[i]的值,如果找到了就直接返回
用到的函数:find()找到了返回值,没找到返回end()尾部最后一个元素的下一个地址
小总结:用到了哈希表的特性,算是哈希表的直接应用。时间复杂度O(n),空间复杂度O(n)这个空间开销来自哈希表