2024/3/10刷题记录 模拟 差分算法 并查集

差分算法

小明拥有 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=' ')

并查集

547. 省份数量 - 力扣(LeetCode)

有 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]]))

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值