小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
今天刷了一道算法题,太久没刷,脑子不会转了,借鉴了一下大佬的做法,收获挺大,记录一下,干巴得!
题目描述:
有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。主办方提供了 2*N 道题目,整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。
若每位扣友选择不同的一题,请返回被选的 N 道题目至少包含多少种知识点类型。
示例:
输入:questions = [1,5,1,3,4,5,2,5,3,3,8,6]
输出:2
解释:有 6 位扣友在 12 道题目中选择题目,需要选择 6 题。
选择完成知识点类型为 3、5 的题目,因此至少包含 2 种知识点类型。
解题思路:
得到没种知识点出现的次数,按次数降序排序,次数依次累加,知识点种类累加,当和大于N(扣友)时,此时的知识点种类即为至少包含的知识点类型。
代码:
/**
* @param {number[]} questions
* @return {number}
*/
var halfQuestions = function(questions) {
let len = questions.length / 2; //计算N值
let map = new Map();
for (let q of questions){
if(map.has(q)){
map.set(q, map.get(q) + 1)
}else {
map.set(q, 1)
}
}
let arr = [...map.values()] //转换为数组
arr.sort((a, b) => (b - a)) //降序排序
let count = 0;
let sum = 0;
for(let i = 0; i < arr.length; i++){
sum += arr[i]
count ++;
if(sum >= len){
break;
}
}
return count;
};
最后:
结果不太理想,需要优化~哭唧唧