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。

相关推荐
Espresso Macchiato7 天前
Leetcode 3715. Sum of Perfect Square Ancestors
算法·leetcode·职场和发展·leetcode hard·树的遍历·leetcode 3715·leetcode周赛471
Espresso Macchiato11 天前
Leetcode 3710. Maximum Partition Factor
leetcode·职场和发展·广度优先遍历·二分法·leetcode hard·leetcode 3710·leetcode双周赛167
Espresso Macchiato19 天前
Leetcode 3694. Distinct Points Reachable After Substring Removal
滑动窗口·leetcode medium·leetcode双周赛166·leetcode 3694
Espresso Macchiato19 天前
Leetcode 3700. Number of ZigZag Arrays II
动态规划·leetcode hard·矩阵乘法·leetcode 3700·leetcode周赛469
源代码•宸2 个月前
Leetcode—721. 账户合并【中等】
c++·经验分享·算法·leetcode·并查集
KarrySmile2 个月前
Day55--图论--107. 寻找存在的路径(卡码网)
图论·并查集·寻找存在的路径
菜鸟555553 个月前
图论:并查集
图论·并查集
Espresso Macchiato3 个月前
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·数据结构·算法·并查集