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