Day9 :变态跳台阶
剑指Offer_编程题——变态跳台阶
题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级,求该青蛙跳上一个n级的台阶总共有多少种跳法。
具体要求:
时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M
具体思路:
背景知识介绍 贪心算法相信大家都听说过,但是大家或许没有系统的了解过。这是维基百科对贪心算法介绍:贪心算法 (greedy algorithm) ,又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。比如在旅行推销员问题中,如果旅行员每次都选择最近的城市,那这就是一种贪心算法。 贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。贪心法可以解决一些最优化问题,如:求图中的最小生成树、求哈夫曼编码……对于其他问题,贪心法一般不能得到我们所要求的答案。一旦一个问题可以通过贪心法来解决,那么贪心法一般是解决这个问题的最好办法。由于贪心法的高效性以及其所求得的答案比较接近最优结果,贪心法也可以用作辅助算法或者直接解决一些要求结果不特别精确的问题。 贪心算法的基本思路:建立数学模型来描述问题、把求解的问题分成若干个子问题、对每个子问题求解,得到子问题的局部最优解、把子问题的解局部最优解合成原来问题的一个解。不过贪心算法存在一些问题,比如:不能保证求得的最后解是最佳的,不能用来求最值问题。因此,只适合求满足某些约束条件的可行解范围。 具体解题思路: 其实和上一题跳台阶一样的思路,还是根据实际问题找规律,先求f(1),f(2)……,其实还是递归,不过加了贪心算法,根据我们之前介绍的相关贪心算法的概念,我们用java来实现这个思路。
public class Solution{
public int JumpFloorII(int target){
if(target == 0)
return 0;
if (target == 1)
return 1;
return 2 * JumpFloorII(target - 1);
}
}
代码效果图如图所示:
当然我们可以不用任何算法,直接找规律也可以实现,具体用python实现如下:
class Solution:
def jumpFloorII(self, number):
return pow(2, number - 1)
总结
本道题在上一道题的基础上,进行条件的改编,成了变态跳台阶,考察的知识点由递归变为贪心算法。但是我们还是用到了递归,当然,我们也可以通过找规律,暴力解决这个问题,用python的话一行代码即可实现。本题引进了一个最为重要的算法,就是贪心算法。本文通过维基百科对贪心算法进行了粗略的解释。需要系统学习的可以自行查资料,贪心算法是我们必须掌握的,希望我们通过此题,系统掌握贪心算法。继续加油,争取早日找到工作,Good Luck!!!
参考文献
[1] 五大常用算法之一:贪心算法 [2] 贪心算法
- 动态追踪技术(四):基于 Linux bcc/BPF 实现 Go 程序动态追踪
- Hive 时间转换函数使用心得
- Flume-Hbase-Sink针对不同版本flume与HBase的适配研究与经验总结
- 利用Flume 汇入数据到HBase:Flume-hbase-sink 使用方法详解
- 浅谈保证软件工程质量的一些心得体会
- 基于ELK的nginx-qps监控解决方案
- 2017年年度最烂密码排名
- 字符串方法汇总(三)
- 周鸿祎:“大安全”网络时代 需要AI大数据的技术支持
- 爆料:对扫码支付下手后,据说央行接下来要提高备付金,目标比例42%
- 回顾2017年5大科技突破,“时间晶体”充满想象!
- 1宽币=883?山本宽称要发行自己的数字货币
- 十种深度学习算法要点及代码解析
- 王健林旗下万达网科被曝大裁员 总裁出面说话了
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 空谈发件箱模式(outbox pattern)
- 《一起学sentinel》六、Slot的子类及实现之FlowSlot和DegradeSlot
- Hive UDF/UDAF 总结
- 3分钟短文:用Laravel发一封“漂洋过海”的电子邮件
- leetcode之单词替换
- KMP算法分析
- Spring Boot 系列:最新版优雅停机详解
- 前端学数据结构与算法(八): 单词前缀匹配神器-Trie树的实现及其应用
- 突击并发编程JUC系列-Locksupport 与 Condition
- 01.视频播放器框架介绍
- C#扫描器编写各种问题荟萃
- JavaScript中的浅拷贝与深拷贝
- 自己实现一个VUE响应式--VUE响应式原理
- 各种CSS居中方案
- JavaScript的内存管理