剑指offer:变态跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路
- 首先想到的解决方案是根据普通跳台阶题目改编,因为可以跳任意级,所以要加上前面台阶的所有可能,最后再加上可以一步跳上最后一阶的可能。
 
public class Solution { 
    public int JumpFloorII(int target) { 
        if (target == 1) 
            return 1; 
        if (target == 2) 
            return 2; 
        // sum用于保存前面所有台阶次数的和 
        int sum = 3; 
        int total = 0; 
        for (int i=3; i<=target; i++){ 
            // +1 的意思就是一步就跳上来 
            total = sum + 1; 
            sum += total; 
        } 
        return total; 
    } 
} 
- 更进一步我们可以推导出该问题的通项公式
 
关于本题,前提是n个台阶会有一次n阶的跳法。分析如下:
f(1) = 1
f(2) = f(2-1) + f(2-2) //f(2-2) 表示2阶一次跳2阶的次数。
f(3) = f(3-1) + f(3-2) + f(3-3)
…
f(n) = f(n-1) + f(n-2) + f(n-3) + … + f(n-(n-1)) + f(n-n)说明:
1)这里的f(n) 代表的是n个台阶有一次1,2,…n阶的 跳法数。
2)n = 1时,只有1种跳法,f(1) = 1
3) n = 2时,会有两个跳得方式,一次1阶或者2阶,这回归到了问题(1) ,f(2) = f(2-1) + f(2-2)
4) n = 3时,会有三种跳得方式,1阶、2阶、3阶,
那么就是第一次跳出1阶后面剩下:f(3-1);第一次跳出2阶,剩下f(3-2);第一次3阶,那么剩下f(3-3)
因此结论是f(3) = f(3-1)+f(3-2)+f(3-3)
5) n = n时,会有n中跳的方式,1阶、2阶…n阶,得出结论:
f(n) = f(n-1)+f(n-2)+…+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + … + f(n-1)6) 由以上已经是一种结论,但是为了简单,我们可以继续简化:
f(n-1) = f(0) + f(1)+f(2)+f(3) + … + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + … + f(n-2)
f(n) = f(0) + f(1) + f(2) + f(3) + … + f(n-2) + f(n-1) = f(n-1) + f(n-1)
可以得出:
f(n) = 2*f(n-1)7) 得出最终结论,在n阶台阶,一次有1、2、…n阶的跳的方式时,总得跳法为:
              | 1       ,(n=0 )  
f(n) =        | 1       ,(n=1 ) 
              | 2*f(n-1),(n>=2) 
  
所以可以写出如下代码:
public class Solution { 
    public int JumpFloorII(int target) { 
        if (target <= 0) { 
            return -1; 
        } else if (target == 1) { 
            return 1; 
        } else { 
            return 2 * JumpFloorII(target - 1); 
        } 
    } 
} 
  
3, 当然我们拒绝递归调用,因为递归会造成很多重复计算或是内存溢出风险
class Solution { 
public: 
    int jumpFloorII(int number) { 
        int jumpFlo=1; 
        while(--number) 
        { 
            jumpFlo*=2; 
        } 
        return jumpFlo; 
    } 
}; 
 
- 还有什么地方可以优化呢? 乘法是不是还可以用二进制位移操作优化呢!
 
public class Solution { 
    public int JumpFloorII(int target) { 
        if(target<=0) 
            return 0; 
        return 1<<(target-1); 
    } 
}
剑指offer:变态跳台阶的更多相关文章
- (原)剑指offer变态跳台阶
		
变态跳台阶 时间限制:1秒空间限制:32768K 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 分析一下明天是个斐波那契 ...
 - 剑指Offer 变态跳台阶
		
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 其实就是斐波那契数列问题. 假设f(n)是n个台阶跳的次数. f(1) = ...
 - 剑指offer——变态跳台阶
		
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 问题分析 由于每次跳的阶数不确定,没有一个固定的规律,但是可以了解的是后一次跳 ...
 - 用js刷剑指offer(变态跳台阶)
		
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 牛客网链接 思路 假设青蛙跳上一个n级的台阶总共有f(n)种跳法. 现在青蛙从第n个台阶 ...
 - 《剑指offer》 跳台阶
		
本题来自<剑指offer> 跳台阶 题目1: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 思路: 同上一篇. C ...
 - 剑指offer:跳台阶
		
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:跳台阶 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). ...
 - 剑指offer例题——跳台阶、变态跳台阶
		
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 思路: n<=0时,有0种跳法 n=1时,只有一种跳法 n=2时,有 ...
 - 牛客网——剑指offer(跳台阶以及变态跳台阶_java实现)
		
首先说一个剪枝的概念: 剪枝出现在递归和类递归程序里,因为递归操作用图来表示就是一棵树,树有很多分叉,如果不作处理,就有很多重复分叉,会降低效率,如果能把这些分叉先行记录下来,就可以大大提升效率——这 ...
 - 剑指offer:跳台阶问题
		
基础跳台阶 题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 解题思路 这道题就是斐波那契数列的变形问法,因为跳上第N个台阶 ...
 - Go语言实现:【剑指offer】跳台阶
		
该题目来源于牛客网<剑指offer>专题. 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 1阶:共1种跳法: 2阶 ...
 
随机推荐
- localStorage 知识点
			
先补充下localStorage 知识点:JS对象读取形式:localStorage.name添加/修改localStorage.name = "xuanyuan"其中" ...
 - jeDeta 日历控件的那些坑
			
经过亲自测试 jeDeta 发现 jeDeta 还是有坑的: 1.参数 options 里面的 format 有很多种格式 API 里面写的是 format: 'YYYY-MM-DD hh:mm:ss ...
 - Python--详解Python中re.sub
			
给出定义: re.sub(pattern, repl, string, count=0, flags=0) Return the string obtained by replacing the le ...
 - GUI练习3
			
将阿里山的积分卡拉斯的发生的咖啡机啊圣考虑到发送到敬爱费卢卡斯加
 - python五十六课——正则表达式(常用函数之search())
			
函数:search(regex,string,[flags=0]):参数:和match一样理解功能:从头开始匹配字符串中的数据,如果头不匹配继续往后尝试匹配,直到有第一个匹配成功的子数据,立即返回一个 ...
 - DNS攻击
			
DNS攻击 实验是基于Linux系统,配置了bind9服务的机器 大纲 本地修改Host文件重定向路径到指定地址 对User的DNS查询进行欺骗攻击 在同一局域网下,对DNS服务器的DNS查询进行欺骗 ...
 - Qt发起Http/Https请求
			
1. BurpSuite抓包 1.1 设置代理 burpsuite代理设置 浏览器代理设置(chrome),其他浏览器同理. 地址栏输入 chrome://settings/, 打开代理设置 设置代理 ...
 - PAT A1144 The Missing Number (20 分)——set
			
Given N integers, you are supposed to find the smallest positive integer that is NOT in the given li ...
 - 运行Android Studio自带模拟器报:Guest isn't online after 7 second...
			
今天在运行Android Studio自带的手机模拟器时,出现如下异常情况 : 解决办法: 1.打开Android Virtue Device Manager,点击编辑选项 2.点击show Adva ...
 - Linux命令——df/du/time
			
一.df(disk free) df命令可以用来检查 linux服务器的文件系统的磁盘空间占用情况,可以知道硬盘被占用了多少空间,目前还剩下多少空间等信息. 1)命令格式 df [参数] 文件名 2) ...