后进先出:栈、递归、DFS 不撞南墙不回头,爆搜 多阶段决策问题 状态变量,用栈空间保存 先设计,再编码 先画图,再编码 分支如何产生?题目需要的解在哪
深度优先遍历(回溯) 回到上一个节点时之前做了什么,之后就要做相应的逆操作,即“状态重置” 递归终止条件 状态:每一个结点表示了求解问题的不同阶段
判断逻辑太多应反思是否有没注意到的规律 left, right = 0, len(nums) - 1 二分查找mid需要+1/-1来确定新边界 二分查找的实现细节 是否有等于号,较小的边界判断有
while循环可以和for循环相互转换 for i in range(n - 1, -1, -1)
双指针用得好很简洁 leetcode第26题删除排序数组中的重复项 class Solution: def removeDuplicates(self, nums: List[int]): if len(nums) <= 1: return len(nums) prev, ptr = 0, 1 while ptr < len(nums): while ptr < len(nums) and nums[ptr] == nums[ptr-1]: ptr += 1 if ptr < len(nums): nums[prev+1] =
链表如何遍历更优雅? leetcode第23题合并K个升序数组 双指针,一个遍历,一个定位插入 # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next def merge2list(alist, blist): ans
递归时若有参数是不断减少的列表,要注意递归到第二层停止 链表小心节点循环,不要ans.next = ans 头插 tmp.next = head head = tmp 中间插(原地) prev = head prev = prev.next ...
列表遍历时遍历索引比遍历元素方便 类似操作指针 双指针,指针的移动是关键 单独移还是全部移 求最值,不断更新最值比存储若干值再求最要好 函数中的函数用
双指针可以将两重循环变为一重循环 不重复用循环添加或是添加后哈希都是很蠢的 在添加的时候通过条件判断跳过 三重循环要有意识地至少降低到两重 如果至少
python的for…else…或while…else可以用于跳出外层循环 python的any()