【排序-中等】1481. 不同整数的最少数目

【题目】
给你一个整数数组 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值