1. 问题描述:
给你一个整数数组 arr 和一个整数 k 。现需要从数组中恰好移除 k 个元素,请找出移除后数组中不同整数的最少数目。
示例 1:
输入:arr = [5,5,4], k = 1
输出:1
解释:移除 1 个 4 ,数组中只剩下 5 一种整数。
示例 2:
输入:arr = [4,3,1,1,3,3,2], k = 3
输出:2
解释:先移除 4、2 ,然后再移除两个 1 中的任意 1 个或者三个 3 中的任意 1 个,最后剩下 1 和 3 两种整数。
提示:
1 <= arr.length <= 10^5
1 <= arr[i] <= 10^9
0 <= k <= arr.length
2. 思路分析:
① 题目还是比较容易理解的,一个比较容易想到的是使用map来进行统计数组中数字出现的次数,然后我们开始对出现次数比较少的数字进行删除,使用一个变量进行当前删除数字的数字进行累加,当发现当前累加的次数加上当前即将要删除的数字的次数大于了k之后说明map中键的数目就是我们删除之后不同整数的最少数目
② 因为使用的是python3语言,所以使用到了与Java或者C++中的map类似的字典dict进行计数,其实本质上是一个东西,只是表达的形式不一样了,在循环中对数组中的数字进行计数,然后对字典中的值进行排序,累加数字出现的次数进行删除操作
③ 除了自己使用字典进行计数之外,领扣的题解中看到可以使用Collections中的Counter方法对列表中的元素进行计数,然后对得到的值进行排序,后面的逻辑与上面提到的是一样的
3. 代码如下:
class Solution:
def findLeastNumOfUniqueInts(self, arr: List[int], k: int) -> int:
# 一个很比较容易想到的使用字典来统计各个数字出现的次数然后先对出现次数少的开始删除
map = {}
for i in range(len(arr)):
# 判断python中的字典中是否存在这样的一个key
if arr[i] not in map:
map[arr[i]] = 1
# 在原来的次数上加1: python3中没有自增的符号了
else:
map[arr[i]] += 1
# 排序之后得到的是一个list
map = sorted(map.items(), key=lambda item: item[1])
sum = 0
temp = map.copy()
for cur in temp:
if sum + cur[1] <= k:
# print("dsd")
sum += cur[1]
map.pop(0)
else:
return len(map)
return 0
Collections.Counter方法:
class Solution:
def findLeastNumOfUniqueInts(self, arr: List[int], k: int) -> int:
# 使用到了python3中计算列表中的元素次数的Counter函数进行计数
counts = list(Counter(arr).values())
counts.sort()
n, sum = 0, 0
for cur in counts:
if sum + cur <= k:
sum += cur
n += 1
else:
return len(counts) - n
return 0