前言
这篇文章主要整理一些算法竞赛常用模板的 Python 实现,适用于编程算法竞赛,大厂手撕代码,算法设计与分析期末考试等等...
话不多说,我们开始吧~
建议先食用:
题目来源:AcWing
目录
- 前言
- 第一章------基础算法
-
- [1.1 二分](#1.1 二分)
-
-
- [题1 数的范围](#题1 数的范围)
- [题2 数的三次方根](#题2 数的三次方根)
-
- [1.2 前缀和](#1.2 前缀和)
-
-
- [题1 一维前缀和](#题1 一维前缀和)
- [题2 二维前缀和](#题2 二维前缀和)
-
第一章------基础算法
1.1 二分
题1 数的范围

输入样例:
6 3
1 2 2 3 3 4
3
4
5
输出样例:
3 4
5 5
-1 -1
链接:789. 数的范围
python
import os
import sys
def solve(x: int) -> None:
# 二分查找 x 最左边的位置
l, r = 0, n - 1
while l < r:
mid = (l + r) >> 1
if a[mid] < x:
l = mid + 1
else:
r = mid
if a[l] == x:
print(l, end = " ")
else:
print("-1 -1") # 不存在 x 按要求返回 -1 -1
return
# 二分查找 x 最左边的位置
l, r = 0, n - 1
while l < r:
mid = (l + r + 1) >> 1
if a[mid] > x:
r = mid - 1
else:
l = mid
print(r)
if __name__ == '__main__':
n, k = map(int, input().split())
a = list(map(int, input().split()))
for i in range(k):
q = int(input())
solve(q)
题2 数的三次方根

输入样例:
1000.00
输出样例:
10.000000
链接:790. 数的三次方根
python
import os
import sys
def solve():
n = float(input())
l, r = -10000.0, 10000.0
while r - l >= 1e-8:
mid = (l + r) / 2
if mid**3 > n:
r = mid
else:
l = mid
print('{:.6f}'.format(l))
if __name__ == '__main__':
solve()
1.2 前缀和
题1 一维前缀和

输入样例:
5 3
2 1 3 6 4
1 2
1 3
2 4
输出样例:
3
6
10
链接:795. 前缀和
python
import os
import sys
def solve():
n, m = map(int, sys.stdin.readline().split())
array = [0] + list(map(int, sys.stdin.readline().split()))
suma = [0] * (n + 1)
for i in range(1, n + 1):
suma[i] = suma[i - 1] + array[i]
for i in range(m):
l, r = map(int, sys.stdin.readline().split())
print(suma[r] - suma[l - 1])
if __name__ == '__main__':
solve()
题2 二维前缀和

输入样例:
3 4 3
1 7 2 4
3 6 2 8
2 1 2 3
1 1 2 2
2 1 3 4
1 3 3 4
输出样例:
17
27
21
链接:796. 子矩阵的和
python
import os
import sys
def solve_2d():
n, m, k = map(int, sys.stdin.readline().split())
array = list(list(map(int, sys.stdin.readline().split())) for i in range(n))
suma = [[0] * (m + 1) for i in range(n + 1)]
for i in range(1, n + 1):
for j in range(1, m + 1):
# 注意 array 的下标要 - 1,因为 array 是从 0 索引的
suma[i][j] = suma[i - 1][j] + suma[i][j - 1] - suma[i - 1][j - 1] + array[i-1][j-1]
for i in range(k):
x1, y1, x2, y2 = map(int, sys.stdin.readline().split())
print(suma[x2][y2] - suma[x1 - 1][y2] - suma[x2][y1 - 1] + suma[x1 - 1][y1 - 1])
if __name__ == '__main__':
solve_2d()