1481 不同整数的最少数目(字典、分析)

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值