70. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 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
语法知识点
- python交换元素顺序可以不借助中间变量temp,而是使用一行代码root.left,root.right = root.right,root.left
- 递归中如果要调用同名的类内方法,要在方法前加上self.,如reverseList
- 异或可以用1-x代替(而不用(1+x)%2)