【leetcode刷题day2】递归

70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶

解析

【普通递归】
爬n阶台阶,最后的情况是一次走1级,还剩一次走2级,这就是2种方法。如果是最后走1级的方法,那么方法数就是climbStairs(n-1),如果是最后走2级的方法,那么方法数就是climbStairs(n-2),二者加起来得到总方法数。终止条件是走1级台阶有1种方法,走2级台阶有2种方法。
递推公式 :climbStairs(n) = climbStairs(n-1)+ climbStairs(n-2)
终止条件:climbStairs(1) = 1, climbStairs(2) = 2
【优化】
以上递归容易超时,我们使用一个数组s[i] 来保存各级台阶需要的方法数。通过一个循环来进行:
s[1] = 1
s[2] = 2
for i in range(3,n+1):
s[i] = s[i-1] + s[i-2]

206. 反转链表

在这里插入图片描述

解析

相当于把所有指针都反向,反向指针大概是这个意思,以node表示当前节点:
node1 ——> node2
node.next.next = node #把当前节点的下一个节点的指针指向当前节点)
node1 <——> node2
node.next = None #取消掉原来的指针,否则形成了环
node1 <—— node2
【递归法】 递归的思想就是reverseList(head.next),如果剩余的结点都翻转好了, 就把root和root.next之间的箭头翻转。
需要注意的是,要新定义一个node,保存的是翻转之后的序列的头。因为原来的head已经不是head了。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head:
            return None
        elif not head.next:
            return head
        else:
            tmp = head.next
            newhead = self.reverseList(tmp)
            tmp.next = head
            head.next = None
        return newhead

语法知识点

  1. python交换元素顺序可以不借助中间变量temp,而是使用一行代码root.left,root.right = root.right,root.left
  2. 递归中如果要调用同名的类内方法,要在方法前加上self.,如reverseList
    在这里插入图片描述
  3. 异或可以用1-x代替(而不用(1+x)%2)

猜你喜欢

转载自blog.csdn.net/a61022706/article/details/135039118