第一个都做不对
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;
}
};