前言
如何判断你的思路对于这道题目是否正确,相信这是令许多人日思夜想的问题。今天,本蒟蒻就带领大家一起来分析判断方法。
看看题目
在了解方法之前,我们先看一道题目:
你肯定十分得意——这不就是简单的BFS吗?
上代码!
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e8+5;
int a[N];
int x,y;
queue<int>que;
void bfs(){
que.push(x);
while(!que.empty()){
int nx=que.front();que.pop();
if((nx+1)<=y && a[nx+1]==0){
a[nx+1]=a[nx]+1;
que.push(nx+1);
}
if((nx*2)<=y && a[nx*2]==0){
a[nx*2]=a[nx]+1;
que.push(nx*2);
}
}
}
signed main(){
int res=0;
cin>>x>>y;
bfs();
cout<<a[y];
}
但是······请注意本蒟蒻标红的地方,天哪!1e9!上哪儿去找这么大的数组呀?数组大小肯定超了呀!
喷子驾到
喷子:等等,你胡说八道!其实有vector容器的!
我: 空间复杂度有可能没超,可时间复杂度呢?
喷子:这······
引入正题
注意我在上小段加粗的词:数组大小、空间复杂度、时间复杂度。接下来,我们就来具体分析一下这三点。
数组大小
这点比较简单,除非有特殊限制,否则开1e6即可。
注意点
数组千万别开到1e9,否则会CE。
时间复杂度
看一下下面代码的时间复杂度是多少?
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,res;
cin>>n;
for(int i=1;i<=100;i++){
res+=n;
}
cout<<res;
}
揭晓答案:O(1),在这里,O(1)不代表只运行了1次循环,而是代表进行了常数次循环。在这里,该常数为100。
常见问题
Q:一秒时限最大是多少时间复杂度呢?
A:是O(1e8)。
Q:O(n)的时间复杂度是什么意思呢?
A:是时间复杂度与输入大小成正比。
Q:O()的时间复杂度是什么意思呢?
A:是时间复杂度成平方生长。
空间复杂度
题目中会出现一个内存限制,这就是空间复杂度限制:
数组只要不开过1e8,对于256MB基本没问题。
总结
时间复杂度、空间复杂度、数组大小三者缺一不可,如果三项都满足要求,那就可以写程序试一下啦!