- 未知量是什么?
- 已经数据是什么?
- 引入适当的符号,用哪个字母表示未知量?
- 联系上述未知量的条件是什么?
- 为了确定未知量是否需要辅助元素(引入几个新的符号。比如题目求 x^4 + 3x^2 = 15 最简单的引入 y = x^2,等价于 y^2 + 3y = 15)?
- 这是一个合理的题目吗?(条件是否足以确定未知量)
- 有没有可能将其转化为一个已经学习过的知识?(观察未知量,并尽量想出一道你所熟悉的具有相同或相似未知量的题目。每道题都按照这个步骤思考, 那么这个步骤 7 就不会很难)如果还是不能,不妨尝试变化,转化,修改题目,然后重新描述(比如简化或消除题目中的某几个未知量)。
- 你卡在了哪个环节?为什么卡到这里了?
- 如果实在无思路,尝试将题目的数据和答案列举出来分析规律,使用数学归纳来帮助你
- 明确题目,限定条件,确保它是一个可解的题目。
- 如果题目条件太宽泛,不足以确定未知量,你可以问问题。(可选)
- 用自己的语言复述一遍,确保理解没问题
- 说思路
- 写代码
- 做完题目自己代入例子过一下(自己多想几个例子)
- logn nlogn
- n!
- 2^n
递归的时间复杂度分析:
- 画递归树图
- 递推公式
def backtrack(remain, comb, curr):
if remain == 0:
results.append(list(comb))
return
for i in range(n):
for j in range(n):
backtrack(remain - 1, comb, curr + 1)
return
backtrack(target, [], 0)
T(remain, curr) = n^2 * T(remain-1, cur+1) T(remain-1, cur+1) =
def backtrack(remain, comb, curr):
if remain == 0:
results.append(list(comb))
return
for i in range(curr, len(candidates)):
if i > curr and candidates[i] == candidates[i - 1]:
continue
pick = candidates[i]
if remain - pick < 0:
break
comb.append(pick)
backtrack(remain - pick, comb, i + 1)
comb.pop()
T(remain, cur) = n*T(remain, cur+1)
T(n) = T(n/2) + 1
从简单思路入手, 从特殊入手(题目的 case) 再推广到一般
xxx 匹配都可以考虑用栈,或者递归
一句话描述枚举:把所有可能的解都列举一遍,并检查
一道题, 你至少有一种非常暴力的解,这个解也可以不通过测试用例。
-
给你一个 nums, 让你求最大值(第二大,第三大), 平均值, 分析复杂度。
-
给你一个 nums, 让你求值 v 在数组中第几项,分析复杂度。
-
手动实现 pop(i), 时间复杂度
考点:什么是树,如何用代码表示,遍历树。应用场景,相关算法和技巧。
作业:
- 两数和
- https://leetcode.cn/problems/minimum-size-subarray-sum/
- https://github.com/azl397985856/leetcode/blob/master/thinkings/binary-search-2.md
题型一:反转链表 将某个链表进行反转。题目描述参考:206. 反转链表
题型二:合并链表 将两条有序或无序的链表合并成一条有序链表。题目描述参考: 21. 合并两个有序链表
图的遍历以及之前的内容