方法1 暴力地柜,超时了。。从头遍历,每次遍历两种可能 大该是o2的n
class Solution {
int count=0;
public int climbStairs(int n) {
process(n,0);
return count;
}
public void process(int n,int cur){
if(n==cur){
count++;
return;
}
if(cur>n) return ;
process(n,cur+1);
process(n,cur+2);
}
}
方法2:抽象成斐波那契,fn表示到n节的可能的和,还是超时。。。
class Solution {
public int climbStairs(int n) {
if(n==1){
return 1;
}
if(n==2){
return 2;
}
return climbStairs(n-1)+climbStairs(n-2);
}
}
方法3:记忆化搜索,我不知道为什么,三木那块就是不对,就是后面的不执行。。
修正:找到原因了,三木运算付优先级太低了,所以+号会执行的,所以用括号括起来就好了。。。。牛客果然是大神聚集地,以后不会就去牛客发帖子
class Solution {
public int climbStairs(int n) {
int[] a=new int[n+1];
return process(a,n);
}
public int process(int[] a,int n){
if(n==1){
a[1]=1;
return 1;
}
if(n==2){
a[2]=2;
return 2;
}
if(a[n-1]>0){
a[n]=a[n]+a[n-1];
}else{
a[n]+=process(a,n-1);
}
if(a[n-2]>0){
a[n]=a[n]+a[n-2];
}else{
a[n]+=process(a,n-2);
}
//a[n]=a[n-1]>0?a[n-1]:process(a,n-1)+a[n-2]>0?a[n-2]:process(a,n-2);
return a[n];
}
}
方法4:dp解法(这个应该是最简单的dp)
class Solution {
public int climbStairs(int n) {
int [] a=new int[n+1];
if(n==1) return 1;
if(n==2) return 2;
a[1]=1;
a[2]=2;
for(int i=3;i<=n;i++){
a[i]=a[i-1]+a[i-2];
}
return a[n];
}
}