有 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 种知识点类型。
提示:
questions.length == 2*n
2 <= questions.length <= 10^5
1 <= questions[i] <= 1000
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/WqXACV
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解:
let halfQuestions = function (questions) {
const m = {}
// 通过for of给每个数组里面的value计数
for (const i of questions) {
if (!m[i]) {
m[i] = 0
}
m[i] += 1
}
// 对value排序行为(从大到小)
let sortarr = Object.values(m).sort((a,b)=>b-a)
// 从大到小开始求和,大于N位扣友的时候开始停止循环
let sum = 0;//定义在外面
for (let i = 0; i < sortarr.length; i++) {
sum += sortarr[i]
if (sum >= questions.length/2) {
return i+1
}
}
}
let questions = [1,5,1,3,4,5,2,5,3,3,8,6];
console.log(halfQuestions(questions));
注:
1.for of 循环可以轻松的遍历数组或者其它可遍历的对象,例如字符串、对象等。
2. Object.values(m).sort根据键值对的value排序,如果从小到大的排序使用a-b,反之就是b-a