📅  最后修改于: 2023-12-03 15:40:02.876000             🧑  作者: Mango
给定一个整数数组 nums 和一个整数 k,你需要将 nums 中的元素替换,使得数组中最多只有 k 个不同的元素,并返回数组的最小替换次数。
将滑动窗口拆分成左右两端,左端为 i,右端为 j。j 先往右移动,每次更新窗口内的元素。当窗口内元素的种类数超过了 k 时,i 往右移动,将窗口收缩到满足要求的范围。在整个过程中,不断更新最小替换次数的值。
具体实现见以下代码:
def min_replace(nums, k):
d = {}
i, j = 0, 0
n = len(nums)
res = n
while j < n:
if nums[j] not in d:
d[nums[j]] = 1
else:
d[nums[j]] += 1
while len(d) > k:
d[nums[i]] -= 1
if d[nums[i]] == 0:
del d[nums[i]]
i += 1
res = min(res, j - i + 1)
j += 1
return res
使用两个指针 left 和 right 分别表示当前窗口的左右端点。用字典记录每个元素出现的次数,当窗口内元素的种类数超过了 k 时,将 left 往右移动。
具体实现见以下代码:
def min_replace(nums, k):
d = {}
left, right = 0, 0
n = len(nums)
res = n
while right < n:
if nums[right] not in d:
d[nums[right]] = 1
else:
d[nums[right]] += 1
while len(d) > k:
d[nums[left]] -= 1
if d[nums[left]] == 0:
del d[nums[left]]
left += 1
res = min(res, right - left + 1)
right += 1
return res
时间复杂度:$O(n)$,其中 n 为数组长度。
空间复杂度:$O(k)$,最坏情况下字典 d 中最多存储 k 个键值对。
题目描述:给定一个整数数组 nums 和一个整数 k,从 nums 中删除最小数量的元素,使得 nums 中最多只有 k 个不同的元素。
方法1:滑动窗口,将滑动窗口拆分成左右两端,左端为 i,右端为 j。j 先往右移动,每次更新窗口内的元素。当窗口内元素的种类数超过了 k 时,i 往右移动,将窗口收缩到满足要求的范围。在整个过程中,不断更新最小替换次数的值。
方法2:双指针,使用左右指针 left 和 right 表示窗口的左右端点。用字典记录窗口内每个元素的出现次数,当窗口内元素的种类数超过了 k 时,将左指针 left 往右移动。
两种方法的时间复杂度和空间复杂度均为 $O(n)$ 和 $O(k)$。