Leetcode 3134. Find the Median of the Uniqueness Array

本文介绍了如何解决LeetCode题目3134,即寻找独特元素数组的中位数。主要思路是利用二分法,通过计算独特元素子数组的数量来确定中位数的位置。作者给出了Python代码实现,展示了如何用滑动窗口技巧求解并分析了时间复杂度和内存占用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 解题思路

这一题一开始没有自力搞定也是有点惭愧,思路上其实还挺好想的,看了一下其他大佬们的思路之后就是恍然大悟的感觉,就是一个简单的二分法,我们先随意给出一个值k,然后看unique element的个数不少于k个的subarray的个数有多少个。

显然,对于长度为n的数组,其subarray的个数共有 C n + 1 2 = n ( n + 1 ) 2 C_{n+1}^{2} = \frac{n(n+1)}{2} Cn+12=2n(n+1)个,因此,对于中位数 M M M,必然满足unique element的个数不少于 M M M个的subarray的个数至少为 ⌊ C n + 1 2 2 ⌋ + 1 \lfloor\frac{C_{n+1}^{2}}{2}\rfloor +1 2Cn+12+1个,且对于 M − 1 M-1 M1,其个数必然少于 ⌊ C n + 1 2 2 ⌋ + 1 \lfloor\frac{C_{n+1}^{2}}{2}\rfloor +1 2Cn+12+1个。

因此,我们使用二分法进行查找就行了。

于是,剩下的问题就是怎么对任意一个 k k k去求unique element的个数不少于k个的subarray的个数了,这个我们使用一个滑动窗口就可以了,倒是也不复杂。

2. 代码实现

给出python代码实现如下:

class Solution:
    def medianOfUniquenessArray(self, nums: List[int]) -> int:
        n = len(nums)
        N = n * (n+1) // 2
        M = N // 2 + 1

        def count(m):
            ans = 0
            cnt = {}
            i, j = 0, 0
            while i < n:
                while j < n and len(cnt) < m:
                    if nums[j] not in cnt:
                        cnt[nums[j]] = 1
                    else:
                        cnt[nums[j]] += 1
                    j += 1
                if len(cnt) < m:
                    break
                ans += n-j+1
                cnt[nums[i]] -= 1
                if cnt[nums[i]] == 0:
                    cnt.pop(nums[i])
                i += 1
            return ans

        i, j = 1, n
        while j-i>1:
            m = (i+j) // 2
            if count(m) >= M:
                i = m
            else:
                j = m
        return i

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值