完成一半题目
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 44 ms, 内存: 25.9 MB
/*
* 思路:
* 1. 统计每种知识点类型的出现次数。
* 2. 将知识点类型按出现次数从多到少排序。
* 3. 按顺序选择题目,直到选择的题目数量达到 N。
* 4. 计算选择的题目所包含的知识点类型数量。
*/
import java.util.*;
import java.util.stream.*;
public class Solution {
public int minNumberOfKnowledgeTypes(int[] questions) {
int n = questions.length / 2;
Map<Integer, Long> freqMap = Arrays.stream(questions)
.boxed()
.collect(Collectors.groupingBy(e -> e, Collectors.counting()));
List<Long> freqs = freqMap.values().stream()
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList());
int count = 0, types = 0;
for (long freq : freqs) {
count += freq;
types++;
if (count >= n) {
break;
}
}
return types;
}
}
解释
方法:
题解的思路是首先统计每种知识点类型的题目数量,然后将这些数量排序。接着从数量最多的知识点类型开始选择题目,直到选中的题目数量达到或超过扣友人数的一半。算法的关键在于优先选择那些题目数量多的知识点类型,以尽可能减少所需的不同知识点类型数量。
时间复杂度:
O(n log n)
空间复杂度:
O(n)
代码细节讲解
🦆
算法中的排序步骤对于解题有什么关键作用?不进行排序是否能得到相同的结果?
▷🦆
在题解中提到使用哈希表来统计知识点数量,为什么选择哈希表而不是其他数据结构?
▷🦆
题目中的示例2输出为2,但通过题解的算法,选择3和5类型题目的数量总和是6,那么这是否意味着还有其他组合可能导致输出结果不唯一?
▷