【C++】两数之和

第一个都做不对

class Solution {
public:
    vector<int> twoSum(vector<int>& nums,int target) {
        int i,j;
        for(i=0;i<nums.size();i++){
            for(j=i+1;j<=nums.size();j++){
                if(nums[i]+nums[j] ==target){
                return {i,j};
                }
            }

        }
        return {i,j};
    }
};
==30==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x603000000054 at pc 0x00000040d6e7 bp 0x7fffd87fd2f0 sp 0x7fffd87fd2e8
READ of

数组越级提示,去掉

> j<=nums.size()中等于号

运行成功!

算法

  • 定义:解决特定问题的步骤描述
  • 确定性:算法的每一步都有确定的含义而不会出现二义性
  • 可行性:算法的每一步都可以通过有限次数完成
  • 有穷性:算法在执行有限个步骤时,会自动结束而不会陷入无限循环里

程序执行过程

CPU:从CPU的角度来看,每一行执行一样的操作:读数据——运算——写数据
所有代码执行时间 T(n) 与每行代码的执行次数 n 成比例。

时间复杂度&空间复杂度

T(n):大 O 时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度。当 n 很大时,你可以把它想象成 10000、100000。而公式中的低阶、常量、系数三部分并不左右增长趋势,所以都可以忽略。我们只需要记录一个最大量级就可以了,如果用大 O 表示法表示刚讲的那两段代码的时间复杂度,就可以记为:T(n) = O(n); T(n) = O(n2)。
复杂度分析:时间复杂度和空间复杂度——程序员自由之路

hash表

map<int,int> a;
第一个为key不可更改,第二个为value可以更改//TODO: 感觉反了,再查查资料2021/10/18/22:10
//DONE:没有反,只要记住需要利用索引的寻找的是value221/10/18/22:17
class Solution {
public:
    vector<int> twoSum(vector<int>& nums,int target) {
       map<int,int> a;
       vector<int> b(2,-1);
       for(int i=0; i<nums.size(); i++)
       {
           a[nums[i]] = i; 
       }
       for(int i=0; i<nums.size(); i++){
           if(a.count(target - nums[i]) > 0 && a[target-nums[i] != i]){
               b[0] = i;
               b[1] = a[target-nums[i]];
               break;
           }
       }
       return b;
    }
};

运行错误,原因: && 两边加各加一个()运算,优先级的原因//TODO:复习运算符的优先级——2021/10/18/22:12

class Solution {
public:
    vector<int> twoSum(vector<int>& nums,int target) {
       map<int,int> a;
       vector<int> b(2,-1);
       for(int i=0; i<nums.size(); i++)
       {
           a[nums[i]] = i; 
       }
       for(int i=0; i<nums.size(); i++){
           if((a.count(target - nums[i]) > 0) && (a[target-nums[i]] != i)){
               b[0] = i;
               b[1] = a[target-nums[i]];
               break;
           }
       }
       return b;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RockWang.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值