Leetcode 3695. Maximize Alternating Sum Using Swaps
- Leetcode 3695. Maximize Alternating Sum Using Swaps
- 1. 解题思路
- 2. 代码实现
- 题目链接:3695. Maximize Alternating Sum Using Swaps
1. 解题思路
这一题算是一个比较基础的DSU的题目,就是把所有swap的位置聚合,然后聚合的每一个簇当中的任意元素均可两两互换,最后我们只要考察每一个簇当中的元素顺序排列,大的元素全排到偶数位置上,小的元素全放到奇数位置上,最后看结果的大小即可。
而关于DSU的相关内容,网上内容很多了,我自己也有一篇水文《经典算法:并查集(DSU)结构简介》作为备忘,因此这里就不过多展开了,有兴趣的读者自己查查就行了。
2. 代码实现
给出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] = xreturnclass 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 = 0for elems in groups.values():vals, even = [], 0for num, idx in elems:vals.append(num)if idx % 2 == 0:even += 1m = len(vals)s = sum(vals)if m == even:ans += selif even == 0:ans -= selse:vals = sorted(vals, reverse=True)d = sum(vals[even:])ans += s - d*2return ans
提交代码评测得到:耗时439ms,占用内存64.76MB。