差分算法
小明拥有 N个彩灯,第i个彩灯的初始亮度为 ai。 小明将进行Q次操作,每次操作可选择一段区间,并使区间内彩灯的亮度 +x( 可能为负数)。 求Q次操作后每个彩灯的亮度(若彩灯亮度为负数则输出 )。
输入描述 第一行包含两个正整数 N Q 分别表示彩灯的数量和操作的次数。
第二行包含N个整数,表示彩灯的初始亮度。
接下来 行每行包含一个操作,格式如下:
l r x,表示将区间 l ~ r 的彩灯的亮度 +x 。
差分算法,是对一个连续数据进行加法时采用的操作,可以降低时间复杂度
1. 开辟一个op数组,与源数组等长,令op[l]+=num,op[r+1]-=num
2. 将op进行op[i]+=op[i-1]操作
3. 将op与原数组进行合并
N, Q = map(int, input().split(' '))
s = list(map(int, input().split(' ')))
# 差分集的构建
op = [0] * N
for _ in range(Q):
x, y, z = map(int, input().split(' '))
op[x - 1] += z
if y < N:
op[y] -= z
for i in range(1, N):
op[i] += op[i - 1]
# 差分集与原集合合并
for i in range(N):
ld = s[i] + op[i]
print(ld if ld > 0 else 0, end=' ')
并查集
有 n
个城市,其中一些彼此相连,另一些没有相连。如果城市 a
与城市 b
直接相连,且城市 b
与城市 c
直接相连,那么城市 a
与城市 c
间接相连。
省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。
给你一个 n x n
的矩阵 isConnected
,其中 isConnected[i][j] = 1
表示第 i
个城市和第 j
个城市直接相连,而 isConnected[i][j] = 0
表示二者不直接相连。
返回矩阵中 省份 的数量。
并查集常用模板
find函数用来找a的祖先,union函数用来联合两个关系
def find(a): if a != f[a]: f[a] = find(f[a]) return f[a] def union(a, b): fa = find(a) # 将b的祖先连接到a的祖先上 f[find(b)] = fa
class Solution(object):
def findCircleNum(self, isConnected):
"""
:type isConnected: List[List[int]]
:rtype: int
"""
length = len(isConnected[0])
# f数组模拟:i对应的祖先是f[i]
f = list(range(length))
def find(a):
if a != f[a]:
f[a] = find(f[a])
return f[a]
def union(a, b):
fa = find(a)
f[find(b)] = fa
# 只需要遍历一半
for i in range(length):
for j in range(i + 1, length):
if isConnected[i][j] == 1:
union(i, j)
# 统计祖先竟是我自己的情况。就是省份数量
return sum(f[i] == i for i in range(length))
O=Solution()
print(O.findCircleNum([[1,1,0],[1,1,0],[0,0,1]]))