1707 字
9 分钟
数组题常用 Python 代码模板
数组题常用 Python 代码模板
1. 遍历数组模板
适合:
- 求和
- 最大值/最小值
- 统计次数
- 判断是否存在某个条件
def traverse(nums): for x in nums: print(x)如果需要下标:
def traverse_with_index(nums): for i in range(len(nums)): print(i, nums[i])如果同时要下标和值:
def traverse_with_enumerate(nums): for i, x in enumerate(nums): print(i, x)2. 查找目标值模板
2.1 线性查找
适合无序数组。
def linear_search(nums, target): for i, x in enumerate(nums): if x == target: return i return -12.2 二分查找
适合有序数组。
def binary_search(nums, target): left, right = 0, len(nums) - 1
while left <= right: mid = left + (right - left) // 2
if nums[mid] == target: return mid elif nums[mid] < target: left = mid + 1 else: right = mid - 1
return -13. 找左边界 / 右边界模板
适合:
- 查找第一个等于 target 的位置
- 查找最后一个等于 target 的位置
- 查找满足条件的边界
3.1 找左边界
def left_bound(nums, target): left, right = 0, len(nums) - 1 ans = -1
while left <= right: mid = left + (right - left) // 2 if nums[mid] >= target: if nums[mid] == target: ans = mid right = mid - 1 else: left = mid + 1
return ans3.2 找右边界
def right_bound(nums, target): left, right = 0, len(nums) - 1 ans = -1
while left <= right: mid = left + (right - left) // 2 if nums[mid] <= target: if nums[mid] == target: ans = mid left = mid + 1 else: right = mid - 1
return ans4. 双指针模板
4.1 左右指针模板
适合:
- 反转数组
- 回文判断
- 有序数组两数之和
def two_pointers_opposite(nums): left, right = 0, len(nums) - 1
while left < right: # 根据题意处理 nums[left], nums[right] left += 1 right -= 1例:反转数组
def reverse_array(nums): left, right = 0, len(nums) - 1
while left < right: nums[left], nums[right] = nums[right], nums[left] left += 1 right -= 1
return nums例:有序数组两数之和
def two_sum_sorted(nums, target): left, right = 0, len(nums) - 1
while left < right: s = nums[left] + nums[right] if s == target: return [left, right] elif s < target: left += 1 else: right -= 1
return []4.2 快慢指针模板
适合:
- 删除元素
- 删除重复元素
- 移动零
- 原地压缩
def fast_slow_pointer(nums): slow = 0
for fast in range(len(nums)): if 满足条件: nums[slow] = nums[fast] slow += 1
return slow # 新长度例:移除指定元素
def remove_element(nums, val): slow = 0
for fast in range(len(nums)): if nums[fast] != val: nums[slow] = nums[fast] slow += 1
return slow例:移动零
def move_zeroes(nums): slow = 0
for fast in range(len(nums)): if nums[fast] != 0: nums[slow], nums[fast] = nums[fast], nums[slow] slow += 1
return nums例:有序数组去重
def remove_duplicates(nums): if not nums: return 0
slow = 1 for fast in range(1, len(nums)): if nums[fast] != nums[fast - 1]: nums[slow] = nums[fast] slow += 1
return slow5. 滑动窗口模板
适合:
- 最长连续子数组
- 最短连续子数组
- 满足条件的连续区间
def sliding_window(nums): left = 0 ans = 0 window = 0 # 根据题意维护窗口信息
for right in range(len(nums)): # 1. 扩大窗口 window += nums[right]
# 2. 判断是否需要缩小窗口 while 需要缩小窗口: window -= nums[left] left += 1
# 3. 更新答案 ans = max(ans, right - left + 1)
return ans例:长度最小的子数组和
def min_subarray_len(target, nums): left = 0 total = 0 ans = float('inf')
for right in range(len(nums)): total += nums[right]
while total >= target: ans = min(ans, right - left + 1) total -= nums[left] left += 1
return 0 if ans == float('inf') else ans6. 前缀和模板
适合:
- 区间和查询
- 子数组和问题
- 连续区间统计
6.1 构建前缀和
def build_prefix_sum(nums): prefix = [0] * (len(nums) + 1)
for i in range(len(nums)): prefix[i + 1] = prefix[i] + nums[i]
return prefix6.2 查询区间和 [left, right]
def range_sum(prefix, left, right): return prefix[right + 1] - prefix[left]完整示例
def prefix_sum_example(nums, left, right): prefix = [0] * (len(nums) + 1)
for i in range(len(nums)): prefix[i + 1] = prefix[i] + nums[i]
return prefix[right + 1] - prefix[left]7. 哈希表模板
适合:
- 两数之和
- 统计频率
- 判断是否重复
- 查找是否存在
7.1 两数之和
def two_sum(nums, target): mp = {}
for i, x in enumerate(nums): if target - x in mp: return [mp[target - x], i] mp[x] = i
return []7.2 统计频率
def count_frequency(nums): freq = {}
for x in nums: freq[x] = freq.get(x, 0) + 1
return freq7.3 判断是否有重复
def contains_duplicate(nums): seen = set()
for x in nums: if x in seen: return True seen.add(x)
return False8. 排序后处理模板
适合:
- 去重
- 合并区间
- 三数之和
- 第 k 大/小问题
def sort_then_process(nums): nums.sort()
for i in range(len(nums)): # 排序后按题意处理 pass8.1 合并区间模板
def merge(intervals): intervals.sort(key=lambda x: x[0]) res = []
for interval in intervals: if not res or res[-1][1] < interval[0]: res.append(interval) else: res[-1][1] = max(res[-1][1], interval[1])
return res9. 子数组问题模板
适合:
- 最大子数组和
- 固定长度子数组统计
- 连续区间最优值
9.1 最大子数组和(Kadane)
def max_subarray(nums): cur = nums[0] ans = nums[0]
for i in range(1, len(nums)): cur = max(nums[i], cur + nums[i]) ans = max(ans, cur)
return ans10. 原地修改模板
适合:
- 原地删除
- 原地覆盖
- 原地交换
def inplace_modify(nums): slow = 0
for fast in range(len(nums)): if 满足保留条件: nums[slow] = nums[fast] slow += 1
return nums[:slow]11. 矩阵(二维数组)遍历模板
适合:
- 二维数组
- 矩阵题
- 网格遍历
def traverse_matrix(matrix): rows, cols = len(matrix), len(matrix[0])
for i in range(rows): for j in range(cols): print(matrix[i][j])12. 原地旋转矩阵模板(90度顺时针)
def rotate(matrix): n = len(matrix)
# 转置 for i in range(n): for j in range(i + 1, n): matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
# 每一行反转 for row in matrix: row.reverse()
return matrix13. 固定窗口模板
适合:
- 长度固定的子数组最大和
- 固定长度统计问题
def fixed_window(nums, k): if len(nums) < k: return None
window_sum = sum(nums[:k]) ans = window_sum
for right in range(k, len(nums)): window_sum += nums[right] window_sum -= nums[right - k] ans = max(ans, window_sum)
return ans14. 常用输入处理模板(面试/笔试常见)
nums = list(map(int, input().split()))二维数组输入:
n, m = map(int, input().split())matrix = [list(map(int, input().split())) for _ in range(n)]15. 数组题调试模板
做数组题时,调试很重要,可以加打印观察指针变化。
def debug_two_pointers(nums): left, right = 0, len(nums) - 1
while left < right: print(f"left={left}, right={right}, nums[left]={nums[left]}, nums[right]={nums[right]}") left += 1 right -= 116. 数组题万能思考模板
拿到一道题,先问自己:
# 1. 需要遍历统计吗?# 2. 数组有序吗?能二分吗?# 3. 是连续区间问题吗?能滑动窗口吗?# 4. 能用双指针吗?# 5. 需要频繁求区间和吗?能前缀和吗?# 6. 能排序后处理吗?# 7. 能用哈希表优化吗?# 8. 要求原地修改吗?17. 最常用模板速查版
如果你只想记最核心的,优先记这 7 个:
1)遍历
for i, x in enumerate(nums): pass2)二分查找
left, right = 0, len(nums) - 1while left <= right: mid = left + (right - left) // 23)左右双指针
left, right = 0, len(nums) - 1while left < right: pass4)快慢指针
slow = 0for fast in range(len(nums)): if 条件: nums[slow] = nums[fast] slow += 15)滑动窗口
left = 0for right in range(len(nums)): while 需要缩小: left += 16)前缀和
prefix = [0] * (len(nums) + 1)for i in range(len(nums)): prefix[i + 1] = prefix[i] + nums[i]7)哈希表
mp = {}for i, x in enumerate(nums): pass如果你愿意,我下一步可以继续给你整理成这几种版本之一:
- 数组题 Python 模板精简版(一页背诵)
- LeetCode 数组高频题对应模板
- 每个模板配 1 道经典例题
- 数组题常用 Python 技巧总结(切片、enumerate、sorted、zip 等)
Comment seems to stuck. Try to refresh?✨