【题目】
给你一个整数数组 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
【代码】
执行用时:
196 ms, 在所有 Python3 提交中击败了28.73%的用户
内存消耗:
40.1 MB, 在所有 Python3 提交中击败了6.63%的用户
class Solution:
def findLeastNumOfUniqueInts(self, arr: List[int], k: int) -> int:
counts=dict()
for a in arr:
counts[a]=counts.setdefault(a,0)+1
counts=dict(sorted(counts.items(),key=lambda x:x[1]))
for x in counts:
if counts[x]<k:
k -= counts[x]
counts[x]=0
else:
counts[x]-=k
k = 0
break
cnt=0
for x in counts:
cnt+=counts[x]!=0
return cnt
【方法2】使用collections
freq = collections.Counter(arr).most_common()[::-1]
首先,collections.Counter(arr)将arr列表中的内容进行分组计数,得到一个以元组为元素的列表,例如arr=[1,2,1,2,3]的结果就是{1:2,2:2,3:1},意思是有两个1,两个2,一个3;
其次,使用most_common()函数对其进行排序操作,按照value进行排序,从大到小逆序排列;
最后,[::-1]翻转
值得注意的是most_common()函数用来实现Top n 功能,不写参数的时候对list全部进行逆序排序,写参数的时候对最大的n个元素逆序排序。
class Solution:
def findLeastNumOfUniqueInts(self, arr: List[int], k: int) -> int:
freq = collections.Counter(arr).most_common()[::-1]
ans = len(freq)
for _, occ in freq:
if k >= occ:
ans -= 1
k -= occ
else:
break
return ans