from collections import defaultdict
cnt = defaultdict(int)
for x in nums:
cnt[x] += 1
4)队列 BFS(树/图最常用)
from collections import deque
q = deque([start])
while q:
cur = q.popleft()
5)TopK / '总拿最小的那个'(用堆)
import heapq
h = []
heapq.heappush(h, 3)
heapq.heappush(h, 1)
x = heapq.heappop(h) # 1(最小的先出来)
6)二分(找'左边界/插入位置')
from bisect import bisect_left
i = bisect_left([1,2,4,4,7], 4) # i == 2
7)递归记忆化(避免重复计算,DP/搜索常用)
from functools import lru_cache
@lru_cache(None)deff(i):
if i <= 1:
return1return f(i-1) + f(i-2)
8)list 的拷贝(刷题很常用)
b = a[:] # 拷贝一份(避免一起变)# ans.append(path[:]) 也是同样道理
题型模板区(直接抄)
1)哈希表模板(Two Sum 类)
classSolution:
deftwoSum(self, nums, target):
pos = {}
for i, x inenumerate(nums):
y = target - x
if y in pos:
return [pos[y], i]
pos[x] = i
return []
2)双指针模板(有序数组/左右夹逼)
classSolution:
deftwoSumSorted(self, nums, target):
l, r = 0, len(nums)-1while l < r:
s = nums[l] + nums[r]
if s == target:
return [l, r]
elif s < target:
l += 1else:
r -= 1return [-1, -1]
3)滑动窗口模板(最长/最短子数组)
classSolution:
defminSubArrayLen(self, target, nums):
n = len(nums)
l = 0
s = 0
ans = float('inf')
for r inrange(n):
s += nums[r]
while s >= target:
ans = min(ans, r - l + 1)
s -= nums[l]
l += 1return0if ans == float('inf') else ans
4)栈模板(有效括号)
classSolution:
defisValid(self, s: str) -> bool:
pair = {')':'(', ']':'[', '}':'{'}
st = []
for ch in s:
if ch in"([{":
st.append(ch)
else:
ifnot st or st[-1] != pair.get(ch, '#'):
returnFalse
st.pop()
returnnot st
5)BFS 队列模板(最短路径/层序遍历)
from collections import deque
classSolution:
defbfs(self, start):
q = deque([start])
visited = set([start])
while q:
cur = q.popleft()
# 处理 curfor nxt in []: # 这里替换成邻居列表if nxt notin visited:
visited.add(nxt)
q.append(nxt)
6)二分模板(找左边界)
classSolution:
deflowerBound(self, nums, target):
l, r = 0, len(nums) # 注意 r = len(nums)while l < r:
mid = (l + r)//2if nums[mid] >= target:
r = mid
else:
l = mid + 1return l
7)回溯模板(子集/组合)
classSolution:
defsubsets(self, nums):
ans = []
path = []
defdfs(i):
if i == len(nums):
ans.append(path[:]) # 拷贝快照return# 不选
dfs(i + 1)
# 选
path.append(nums[i])
dfs(i + 1)
path.pop()
dfs(0)
return ans
8)DP 模板(爬楼梯)
classSolution:
defclimbStairs(self, n: int) -> int:
if n <= 2:
return n
a, b = 1, 2for _ inrange(3, n + 1):
a, b = b, a + b
return b
classSolution:
deftwoSum(self, nums, target):
pos = {}
for i, x inenumerate(nums):
y = target - x
if y in pos:
return [pos[y], i]
pos[x] = i
return []
deftest_two_sum():
s = Solution()
assert s.twoSum([2,7,11,15], 9) == [0,1]
assert s.twoSum([3,3], 6) == [0,1]
assert s.twoSum([-1,-2,-3,-4,-5], -8) == [2,4]
if __name__ == "__main__":
test_two_sum()
print("All tests passed.")