一.时间复杂度
时间复杂度是一个函数,用来描述算法的运行时间。常用大O符号表述,常见的算法时间复杂度有小到大依次为:
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<…<O(2n)<O(n!)
时间复杂度计算方法:复杂度为常数表示为O(1);复杂度包含n时,省略其系数和常数项,用n的最高阶项表示;时间复杂度有多个相加时,整体的时间复杂度取其中时间复杂度最高的表示。
二.空间复杂度
空间复杂度是一个算法所耗费的存储空间。
三.例题
1.洛谷 P8780 [蓝桥杯 2022 省 B] 刷题统计
题目描述:
小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a道题目,周六和周日每天做 b 道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n 题?
输入格式:
输入一行包含三个整数 a,b 和 n.
输出格式:
输出一个整数代表天数。
输入输出样例:
输入:
10 20 99
输出:
8
整体思路
方法一:遍历天数直到总题目数大于等于n。
代码如下:
a, b, n = map(int, input().split())
r = 0
i = 1
nt = 0
while nt < n:
if i % 7 == 6 or i % 7 == 0:
nt += b
else:
nt += a
r += 1
i += 1
print(r)
方法二:先遍历周数,计算一周所做的题数,n不是一周所做的题数的整数倍时,再加上每一天的题数。
代码如下:``
a, b, n = map(int, input().split())
nt = 0
d = 0
i = 1
while (nt + 5*a + 2*b) <= n:
nt += 5*a + 2*b
d += 7
while nt < n:
if i < 6:
nt += a
else:
nt += b
d += 1
i += 1
print(d)
2.洛谷 P2249 【深基13.例1】查找
题目描述:
输入 n个不超过 109的单调不减的(就是后面的数字不小于前面的数字)非负整数 a1,a2,…,an然后进行 m 次询问。对于每次询问,给出一个整数 q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 −1 。
输入格式:
第一行 2个整数 n 和 m,表示数字个数和询问次数。
第二行 n 个整数,表示这些待查询的数字。
第三行 m 个整数,表示询问这些数字的编号,从 1 开始编号。
输出格式:
输出一行,m 个整数,以空格隔开,表示答案。
输入输出样例:
输入:
11 3
1 3 3 3 5 7 9 11 13 15 15
1 3 6
输出:
1 2 -1
整体思路
由题中单调不递减的信息可以想到用二分法查询数字。
代码如下:
def b(k):
le = 0
ri = len(l1) - 1
r = -1
while le <= ri:
mi = (le + ri) // 2
if l1[mi] == k:
r = mi + 1
if l1[mi] < k:
le = mi + 1
else:
ri = mi - 1
return r
n, m = map(int, input().split())
l1 = list(map(int, input().split()))
l2 = list(map(int, input().split()))
for i in l2:
print(b(i), end=" ")