leetcode算法-递归

递归

函数直接或间接地调用自己。

生活中的例子

从前有座山的故事。
从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事:从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事:。。。

4个要素

接受的参数
返回值
递归终止条件
递归拆解:如何递归到下一层

斐波拉契数列

0,1,1,2,3,5,8…
f(n) = f(n - 1) + f(n - 2),其中f(0) = 0,f(1) = 1

recursion(int n) {
	if(n < 2)
		return n == 1 ? 1 : 0;
	return recursion(n - 1) + recursion(n - 2);
}

空间复杂度是O(N),因为递归使用了递归栈来存储,一层一层向下递归,遇到终止条件后又一层一层向上返回,最底层的元素相当于是最后进栈的,但是最先返回,所以是先进后出。最上层的n会被一层一层分解直到1,每一层相当于是n-1,所以递归高度为n,而递归栈的空间复杂度是递归的高度,也就是O(N)。

递归相关leetcode

No.509 斐波那契数

思路:当n为0和1时,递归终止,返回0和1。否则将n拆解为fib(n)拆解为fib(n-1)和fib(n-2)返回。

class Solution {
    public int fib(int n) {
        if(n < 2)
            return n == 1 ? 1 : 0;
        return fib(n - 1) + fib(n - 2);
    }
}
No.206 反转链表

思路:
  判断head节点是否为空或head的下一个节点是否为空,是则表示链表为空或当前节点是链表最后一个节点,返回head。
  递归调用本函数直到链表的最后一个节点,即满足上面的条件,返回链表的最后一个节点5到新链表result中,此时head指针指向的是节点4,将节点4的下一个节点5的next指向节点4,将节点4的next指向null,返回包含节点4和节点5的链表到新链表result中,此时head指针指向的是节点3,将节点3的下一个节点4的next指向节点3,将节点3的next指向null,返回包含节点3,4,5的链表到新链表result中,以此类推,直到返回的result包含2,3,4,5,此时头节点指向1,将1的下一个节点2的next指向1,将1的next指向null,返回包含节点1,2,3,4,5的反转之后的链表。

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null)
            return head;
        ListNode result = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return result;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值