Day9 :变态跳台阶

时间:2022-07-24
本文章向大家介绍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] 贪心算法