第五章 递归综合习题(leetcode)

本文介绍了使用递归解决LeetCode中的一些经典问题,包括递归定义的数学表达式(如计算幂)、递归数据结构(如二叉树最大深度和相同树)和递归问题求解方法(如排列、子集和组合),并提供了详细的解题思路和算法分析。
摘要由CSDN通过智能技术生成

下面例举了一些leetcode上面的一些习题,作为前一篇内容的补充。没有涉及到动态规划、分治法的题目,因为那些题目难度都比较大^^。
这些题目主要讲解如何根据书上的三种类型,设计递归算法。对于递归定义,这里选择了一道快速幂的题目;对于递归数据结构,这里超前使用了第7章的二叉树而不是使用之前的链表(线性数据结构使用递归并没有太大的意义,直接使用迭代基本上是很方便了),虽然超前但是应该也很容易明白;对于递归的问题求解方法,这里选择了计算排列、计算组合、计算子集三个经典的问题,以及两道富有实际意义的问题:恢复IP地址、最大的岛屿。

递归的数学表达式定义

计算幂(Pow(x, n))

实现函数double myPow(double x, int n),计算 xn
将幂写成递归定义,即 f(n) 是关于 f(n1) 的递推式,对于 f(n)=xn ,可以有

f(n)={ 1xf(n1)n=0n>0

利用这个等式,可以很容易设计出最原始的递归算法,其时间复杂度和迭代计算一样,为 O(n)
实际上,
xn={ x(xn2)2(xn2)2n=2k+1,kZn=2k,kZ

因此,
f(n)=1x[f(n2)]2[f(n2)]2n=0n=2k+1,kZ+n=2k,kZ+

因此,根据这样的递推式,不难得出下面的程序。不得不说这道题的测试数据非常极端,包含了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值