不同整数的最少数目(leetcoder题目)

题目要求

给你一个整数数组arr和一个整数k 。现需要从数组中恰好移除k个元素,请找出移除后数组中不同整数的最少数目

示例

输入:arr = [5,5,4], k = 1
输出:1
解释:移除 1 个 4 ,数组中只剩下 5 一种整数。

输入: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

分析

每次移除的时候,选取当前数组中数目最少的整数进行移除,例如arr = [5,5,4], k = 1,数目最少的整数为4,因此,首先应该移除4。

  1. 首先建立一个字典,对arr进行遍历,key值存储arr中的整数,value存储这个整数在数组中出现的次数;
  2. 遍历字典,将整数出现的次数存储在一个数组中;
  3. 对数组进行从小到大的排序。对这个数组进行遍历,每遍历一个值的时候,用k减去这个值,如果k等于0, 数组中没有遍历到的值的总的个数为要求的结果,如果k<0,则数组中没有遍历到的值的个数加1为要求的结果(假设当前遍历的是出现次数第m小的值,若k<0, 则代表当前的值不用全部移除便已经达到了移除k个值得条件),如果k>0,则继续进行遍历。

python3.7 实现

class Solution:
    def findLeastNumOfUniqueInts(self, arr: List[int], k: int) -> int:
        counts = {}
        for num in arr:
            if num not in counts:
                counts[num] = 1
            else:
                counts[num] += 1
        lis = []
        for value in counts.values():
            lis.append(value)
        lis.sort()
        for l in range(len(lis)):
            k -= lis[l]
            if k == 0:
                return len(lis[l + 1:])
            if k < 0:
                return len(lis[l : ])

你可能感兴趣的:(python)