题目描述
有 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;
}
};