- [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。