题目描述
有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。主办方提供了 2*N 道题目,整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。 若每位扣友选择不同的一题,请返回被选的 N 道题目至少包含多少种知识点类型。
示例 1:
输入:questions = [2,1,6,2]
输出:1
解释:有 2 位扣友在 4 道题目中选择 2 题。 可选择完成知识点类型为 2 的题目时,此时仅一种知识点类型 因此至少包含 1 种知识点类型。
示例 2:
输入:questions = [1,5,1,3,4,5,2,5,3,3,8,6]
输出:2
解释:有 6 位扣友在 12 道题目中选择题目,需要选择 6 题。 选择完成知识点类型为 3、5 的题目,因此至少包含 2 种知识点类型。
算法分析
标签:哈希表,排序
1.先定义一个哈希表,用于统计每种数字出现的次数
2.将哈希表中的value值排序
3.根据次数与题目的数量进行比较,定义一个sum用于记录次数和,直到sum大于等于题目的数量
完整代码
class Solution {
public:int halfQuestions(vector<int>& questions) {int n=questions.size();int num=n/2;//题目数量unordered_map<int,int>m; for(auto i:questions) {m[i]++;//key为类型,统计数量 }vector<int>v;//把map当中的value放到数组中 for(auto x:m) {v.push_back(x.second); }//从大到小排序 sort(v.begin(),v.end(),greater<int>()); int count=0;//统计需要找多少个数字 int sum=0;//当前的和 for(int i=0;i<v.size();i++) {sum+=v[i]; count++; if(sum>=num) break;//如果找到了,立即停止 }return count; }
};