(算法题)LeetCode --完成一半题目

228 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

今天刷了一道算法题,太久没刷,脑子不会转了,借鉴了一下大佬的做法,收获挺大,记录一下,干巴得!

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

最后:

image.png

结果不太理想,需要优化~哭唧唧