Leetcode 3785. Minimum Swaps to Avoid Forbidden Values

  • [Leetcode 3785. Minimum Swaps to Avoid Forbidden Values](#Leetcode 3785. Minimum Swaps to Avoid Forbidden Values)
    • [1. 解题思路](#1. 解题思路)
    • [2. 代码实现](#2. 代码实现)

1. 解题思路

这一题是Leetcode周赛481的第三题,是一道hard难度的题目。

这一题的话,不难证明,如果可以存在 n n n个元素可以交换满足均不对应forbidden的元素,那么其所需的交换次数最少为 ⌈ n 2 ⌉ \lceil\frac{n}{2}\rceil ⌈2n⌉。

剩下的,我们就是看一下哪些情况下无法完成交换,其实这就两种情况:

  • forbidden当中某一个元素数目过多,以至于原始数组中无法找到足够的其他元素填充到对应的位置当中;
  • 原始数组中某一个元素数目过多,以至于forbidden数组当中至少会有一个forbid的位置会被放入对应的元素。

因此,我们只需要排除一下以上两种情况,然后找出所有需要交换的元素的个数,然后计算一下 ⌈ n 2 ⌉ \lceil\frac{n}{2}\rceil ⌈2n⌉即可。

需要注意的是,一般情况下需要交换的元素个数就是原始数组与forbidden数组一致的元素个数,但是如果其中有一个单一元素占比过高以至于其他需要的元素不够用于交换时,我们需要额外补充一些原本不需要进行交换的元素来与之进行交换。

2. 代码实现

给出python代码实现如下:

python 复制代码
class Solution:
    def minSwaps(self, nums: List[int], forbidden: List[int]) -> int:
        swap = []
        for num, fbd in zip(nums, forbidden):
            if num == fbd:
                swap.append(num)
        if len(swap) == 0:
            return 0
        cnt = Counter(swap)
        tot1, tot2 = Counter(nums), Counter(forbidden)
        for key, val in cnt.items():
            if val > len(nums) - tot1[key]:
                return -1
            elif tot1[key] > len(nums) - tot2[key]:
                return -1
        need_swap = max(len(swap), max(cnt.values()) * 2)
        return (need_swap+1) // 2

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

相关推荐
Espresso Macchiato7 小时前
Leetcode 3786. Total Sum of Interaction Cost in Tree Groups
leetcode hard·leetcode 3786·leetcode周赛481
Espresso Macchiato1 个月前
Leetcode 3748. Count Stable Subarrays
算法·leetcode·职场和发展·leetcode hard·leetcode 3748·leetcode周赛476·区间求和
Espresso Macchiato1 个月前
Leetcode 3739. Count Subarrays With Majority Element II
leetcode hard·前序和数组·leetcode双周赛169·leetcode 3739
Espresso Macchiato2 个月前
Leetcode 3729. Count Distinct Subarrays Divisible by K in Sorted Array
leetcode·leetcode hard·容斥原理·leetcode 3729·leetcode周赛473·前序和数组
Espresso Macchiato2 个月前
Leetcode 3715. Sum of Perfect Square Ancestors
算法·leetcode·职场和发展·leetcode hard·树的遍历·leetcode 3715·leetcode周赛471
Espresso Macchiato2 个月前
Leetcode 3710. Maximum Partition Factor
leetcode·职场和发展·广度优先遍历·二分法·leetcode hard·leetcode 3710·leetcode双周赛167
Espresso Macchiato3 个月前
Leetcode 3700. Number of ZigZag Arrays II
动态规划·leetcode hard·矩阵乘法·leetcode 3700·leetcode周赛469
Espresso Macchiato3 个月前
Leetcode 3695. Maximize Alternating Sum Using Swaps
并查集·leetcode hard·dsu·uf·leetcode 3695·leetcode双周赛166
Espresso Macchiato5 个月前
Leetcode 3624. Number of Integers With Popcount-Depth Equal to K II
leetcode hard·segment tree·分段树·leetcode 3624·leetcode周赛459