🔗 题目链接:1481. 不同整数的最少数目
📚 所属题单:灵茶山艾府 · 贪心算法题单 --- §1.1 从最小/最大开始贪心
🏷️ 难度:Medium | 难度分:1284
🔖 标签:贪心、哈希表、排序
📖 题目描述
给你一个整数数组 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 <= arr.length <= 10^51 <= arr[i] <= 10^90 <= k <= arr.length
💡 思路分析
要让剩余的不同整数种类最少 → 尽可能多消灭整数种类 → 优先干掉出现次数最少的!
想象你在整理书架,要丢掉 k 本书让品种最少。肯定先丢只有 1 本的那个品种,再丢只有 2 本的...... 这样最快清掉一个品种 📚
算法步骤
- 统计频率:用 HashMap 记录每个数出现几次
- 频率排序:从小到大排
- 贪心删除:从频率最小的开始扣减 k,k 够就整个消灭
✅ 代码实现(Java)
java
class Solution {
public int findLeastNumOfUniqueInts(int[] arr, int k) {
Map<Integer, Integer> freq = new HashMap<>();
for (int x : arr) {
freq.merge(x, 1, Integer::sum);
}
List<Integer> counts = new ArrayList<>(freq.values());
Collections.sort(counts);
int removed = 0;
for (int i = 0; i < counts.size(); i++) {
if (k >= counts.get(i)) {
k -= counts.get(i);
removed++;
} else {
break;
}
}
return counts.size() - removed;
}
}
📊 复杂度分析
| 复杂度 | 说明 | |
|---|---|---|
| ⏱️ 时间 | O(n log n) | 频率排序 |
| 💾 空间 | O(n) | 哈希表 |
🔗 参考
📚 和 3545 是镜像题------那道是"删字符使种类 ≤ k",这道是"删 k 个使种类最少"。核心一样:频率排序 + 从最少的开始动手。