leetcode
leetcode 2901 ~ 2950
完成一半题目

完成一半题目

难度:

标签:

题目描述

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)

代码细节讲解

🦆
算法中的排序步骤对于解题有什么关键作用?不进行排序是否能得到相同的结果?
在这个算法中,排序步骤是关键,因为它确保了可以首先选择出现次数最多的知识点类型。这样做可以最大程度地减少所需选择的知识点类型数量达到题目要求的一半。如果不进行排序,算法可能会从出现次数少的知识点类型开始选择,从而导致最终选择的知识点类型数目增多,无法保证以最小的类型数量达到题目要求。因此,排序是优化解题策略的重要步骤,确保了算法的效率和符合题目要求的目标。
🦆
在题解中提到使用哈希表来统计知识点数量,为什么选择哈希表而不是其他数据结构?
哈希表(在Python中通常是字典或Counter类)被用来统计知识点数量,因为它提供了快速的插入、查找和更新操作。这使得统计每种知识点类型的出现频率变得非常高效。相比之下,如果使用列表或数组,我们需要手动处理索引和可能的越界问题;如果使用树结构,虽然可以维护有序性,但在频繁更新操作中可能不如哈希表效率高。因此,哈希表是处理此类“元素计数”问题的最佳数据结构,提供了简洁和高效的解决方案。
🦆
题目中的示例2输出为2,但通过题解的算法,选择3和5类型题目的数量总和是6,那么这是否意味着还有其他组合可能导致输出结果不唯一?
题解中的算法总是寻找一个确保题目数量至少为扣友数一半的最小知识点类型组合。在一些情况下,可能存在多个不同的组合可以达到这个目标,尤其是当多个知识点类型的题目数量相近时。然而,题解算法通过优先选择题目数量最多的知识点类型,来确保所需类型数量最小。因此,尽管可能存在其他组合可以满足题目条件,题解提供的答案依然是最优的选择,即最小化涉及的知识点类型数量。

相关问题