Leetcode 3695. Maximize Alternating Sum Using Swaps

  • [Leetcode 3695. Maximize Alternating Sum Using Swaps](#Leetcode 3695. Maximize Alternating Sum Using Swaps)
    • [1. 解题思路](#1. 解题思路)
    • [2. 代码实现](#2. 代码实现)

1. 解题思路

这一题算是一个比较基础的DSU的题目,就是把所有swap的位置聚合,然后聚合的每一个簇当中的任意元素均可两两互换,最后我们只要考察每一个簇当中的元素顺序排列,大的元素全排到偶数位置上,小的元素全放到奇数位置上,最后看结果的大小即可。

而关于DSU的相关内容,网上内容很多了,我自己也有一篇水文《经典算法:并查集(DSU)结构简介》作为备忘,因此这里就不过多展开了,有兴趣的读者自己查查就行了。

2. 代码实现

给出python代码实现如下:

python 复制代码
class DSU:
    def __init__(self, N):
        self.root = [i for i in range(N)]
        
    def find(self, k):
        if self.root[k] != k:
            self.root[k] = self.find(self.root[k])
        return self.root[k]
    
    def union(self, a, b):
        x = self.find(a)
        y = self.find(b)
        if x != y:
            self.root[y] = x
        return

class Solution:
    def maxAlternatingSum(self, nums: List[int], swaps: List[List[int]]) -> int:
        n = len(nums)
        
        dsu = DSU(n)
        for i, j in swaps:
            dsu.union(i, j)
        groups = defaultdict(list)
        for i in range(n):
            key = dsu.find(i)
            groups[key].append((nums[i], i))
        ans = 0
        for elems in groups.values():
            vals, even = [], 0
            for num, idx in elems:
                vals.append(num)
                if idx % 2 == 0:
                    even += 1
            m = len(vals)
            s = sum(vals)
            if m == even:
                ans += s
            elif even == 0:
                ans -= s
            else:
                vals = sorted(vals, reverse=True)
                d = sum(vals[even:])
                ans += s - d*2
        return ans

提交代码评测得到:耗时439ms,占用内存64.76MB。

相关推荐
源代码•宸1 个月前
Leetcode—721. 账户合并【中等】
c++·经验分享·算法·leetcode·并查集
KarrySmile2 个月前
Day55--图论--107. 寻找存在的路径(卡码网)
图论·并查集·寻找存在的路径
菜鸟555552 个月前
图论:并查集
图论·并查集
Espresso Macchiato2 个月前
Leetcode 3624. Number of Integers With Popcount-Depth Equal to K II
leetcode hard·segment tree·分段树·leetcode 3624·leetcode周赛459
N_NAN_N4 个月前
[蓝桥杯 2024 国 Python B] 设计
java·数据结构·算法·并查集
Espresso Macchiato4 个月前
Leetcode 3563. Lexicographically Smallest String After Adjacent Removals
动态规划·leetcode hard·leetcode周赛451·leetcode 3563
Espresso Macchiato4 个月前
Leetcode 3562. Maximum Profit from Trading Stocks with Discounts
动态规划·背包问题·leetcode hard·leetcode 3562·leetcode周赛451
David Bates4 个月前
代码随想录第42天:图论3
python·并查集
Watink Cpper5 个月前
[数据结构高阶]并查集初识、手撕、可以解决哪类问题?
数据结构·图论··并查集