这两个题之前都写过,今天集中探讨!先上之前两道题的链接!
(45)剑指 Offer 10- I. 斐波那契数列 -[509] 斐波那契数
js(110)~70. 爬楼梯 && 746. 使用最小花费爬楼梯
这2个提核心思想都是通过前两部推到当前步骤,即f(i) = f(i-1) + f(i+2)。用普通递归,地推都能想明白,现在这次我是先写了爬楼梯,再来写斐波那契数列,因为这2个道题一样思想。所以我想着用爬楼梯的方法,滚动指针来解答,发现不对,目前还是想不明白。
\
下面这个是爬楼梯的正确解法。
然后看官方给出的题解以后,得出这道题正确滚动指针的解法如下
var fib = function(n) {
if(n < 2) return n;
let cur = 1; pre = 0, prepre = 0;
for(let i = 2; i <= n; i ++) {
prepre = pre;
pre = cur;
cur = pre + prepre;
}
return cur;
};
我想不明白的是,爬楼梯和斐波那契数列思想是一样的,为啥滚动数组方法,不一样?? 非得用3个变量,于是我继续看js的题解,终于让我找到一个用2个变量来解决斐波那契数列的解法。
var fib = function(n) {
if(n < 2) return n;
let cur = 1, pre = 0;
for(let i = 2; i <= n; i ++) {
const temp = cur + pre;;
pre = cur;
cur = temp;
}
return cur;
};
再然后我把上面解决斐波那契的解法,直接copy到爬楼梯,然后修改一下初始值,直接也可以通过,代码如下!因为爬楼梯n是大于1的所以,上面的判断可以不要
var climbStairs = function(n) {
let cur = 1, pre = 1;
for(let i = 2; i <= n; i ++) {
const temp = cur + pre;;
pre = cur;
cur = temp;
}
return cur;
};
再然后我继续想,这个方法我先用在斐波那契上然后再用到爬楼梯上,最后证明都可以!那之前那个我先用在爬楼梯上再用到斐波那契上的方法应该也是可以,于是我又操作改动了一下,果真可以,代码如下,用于斐波那契的判断条件都不能去掉,因为存在n=0的情况。
var fib = function(n) {
if(n < 2) return n;
let cur = 1, pre = 0;
for(let i = 2; i <= n; i ++) {
const temp = cur;
cur = cur + pre;
pre = temp;
}
return cur;
};
上面这个方法,是我很早就看到了,我记得中间有一次我那这个方法用到斐波那契数列上,但是没有通过,估计是没有改好!今天放在一块整理,发现这两个方法都可以通用,说是两个方法,其实就是一个方法,就是中见for循环里面逻辑不一样,就是储存哪个的问题!由此来看我的基本功力还是不行,还是很需要提高啊! 最后直接把两个方法放到一块来看了!