变态跳台阶

剑指offer之变态跳台阶

题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

问题分析:此题为跳台阶的进阶版,但思考方式其实类似。当站在第n级台阶上,那么可能从n-1,n-2…1,0开始跳,所以我们只需要将所有可能性相加。f(n)表示第n级的跳法,那么f(n)=f(n-1)+f(n-2)+…+f(1)+f(0)。初始条件仍然不变。只需要在做加法时,加上后面的可能性。

具体实现:

import java.util.ArrayList;
public class Solution {
    public int JumpFloorII(int target) {
        ArrayList<Integer> list = new ArrayList<>();
        if(target <= 1){
            return 1;
        }
        list.add(1);
        list.add(1);
        for(int i = 2; i <= target; i++){
            int sum = 0;
            for(int j = 1; j < i+1; j++){
                sum +=list.get(i-j);
            }
            list.add(sum);
        }
        return list.get(target);
    }
}

但在看过牛客上大佬的解法后,发现上述方法时间复杂度较高,为n的2次方。
所以其实可以进行优化:
我们可以看到f(n-1)=f(n-2)+f(n-3)+…+f(1)+f(0);
f(n)=f(n-1)+f(n-2)+f(n-3)+…+f(1)+f(0);
上面两式我们可以看出来f(n)=f(n-1)+f(n-1)=2*f(n-1);
所以我们还可以简化过程,实现如下:

public class Solution {
    public int JumpFloorII(int target) {
        if(target <= 1){
            return 1;
        }
        int a = 1,b = 0;
        for(int i = 2; i <= target; i++){
            b = a << 1;//口诀:左移乘2,右移除2
            a = b;
        }
        return b;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值