周赛20230428
第四题134. 找出唯一性数组的中位数
题目大意:给定一个整数数组nums
,唯一性数组是一个按元素从小到大排序的数组,包含了nums
的所有非空子数组中不同元素的个数。要求返回nums
唯一性数组的中位数,即有序唯一性数组的中间元素。
实现思路:首先,我们需要明确唯一性数组的生成方式,即通过遍历所有非空子数组,计算其中不同元素的个数。然后,我们可以使用二分查找的方法确定唯一性数组的中位数。在二分查找的过程中,我们需要一个辅助函数来判断给定的中位数是否满足条件,即唯一性数组中不同元素的个数大于等于中位数。如果满足条件,我们更新右边界,否则更新左边界,直到左右边界相遇,即找到了唯一性数组的中位数。
class Solution:
def medianOfUniquenessArray(self, nums: List[int]) -> int:
n = len(nums)
k = (n * (n + 1) // 2 + 1) // 2
def check(mid):
j, cnt = 0, 0
fre = Counter()
for i, num in enumerate(nums):
fre[num] += 1
while len(fre) > mid:
fre[nums[j]] -= 1
if fre[nums[j]] == 0:
del fre[nums[j]]
j += 1
cnt += i - j + 1
return cnt >= k
l, r = 1, len(set(nums))
while l < r:
mid = l + r >> 1
if check(mid):
r = mid
else:
l = mid + 1
return l