C++初学者笔记之STL::vector杂记(一)

杂记杂记,顾名思义,就是把在我个人做题中用到的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)这个空间开销来自哈希表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值