持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
🎈算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道中等难度的题目 -> 最小展台数量
题目描述
力扣嘉年华将举办一系列展览活动,后勤部将负责为每场展览提供所需要的展台。 已知后勤部得到了一份需求清单,记录了近期展览所需要的展台类型, demand[i][j] 表示第 i 天展览时第 j 个展台的类型。 在满足每一天展台需求的基础上,请返回后勤部需要准备的 最小 展台数量。
注意:
- 同一展台在不同天中可以重复使用。
示例 1:
输入:demand = ["acd","bed","accd"]
输出:6
解释:
第 0 天需要展台 a、c、d;
第 1 天需要展台 b、e、d;
第 2 天需要展台 a、c、c、d;
因此,后勤部准备 abccde 的展台,可以满足每天的展览需求;
示例 2:
输入:demand = ["abc","ab","ac","b"]
输出:3
提示:
- 1 <= demand.length,demand[i].length <= 100
- demand[i][j] 仅为小写字母
思路分析
首先我们需要先理解一下题意,题目会给我们一个数组demand,记录了近期展览所需要的展台类型,如例1的demand = ["acd","bed","accd"],表示:
第 0 天需要展台 a、c、d;
第 1 天需要展台 b、e、d;
第 2 天需要展台 a、c、c、d;
我们需要提前准备好一批展台,可以满足展览每一天需要的展台数量,我们要计算需要准备的展台最少数量,如例1,我们只需要准备好a、c、c、d四个展台,就可以满足展览每一天的需求。
- 1、统计每一天所需要的各种展台数量
首先我们先以展台类型进行分类统计,统计每一天需要各种展台的数量
let arr = [];
for(let i = 0; i < demand.length; i++){
let m = {};
for(let j = 0; j < demand[i].length; j++){
m[demand[i][j]] = (m[demand[i][j]] || 0) + 1;
}
arr.push(m);
}
- 2、统计各展台每一天所需要数量的最大值
统计好每一天需要各种展台的数量之后,我们便可以计算每种展台在各天所需要的最大数量
let map = {};
for(let i = 0; i < arr.length; i++){
for(let k in arr[i]){
map[k] = Math.max(map[k] || 0,arr[i][k]);
}
}
- 3、将各种展台所需数量的最大值相加
将各种展台每天所需数量的最大值相加即是题目要我们求的结果数量
let res = 0;
for(let k in map){
res += map[k];
}
完整代码如下:
AC代码
/**
* @param {string[]} demand
* @return {number}
*/
var minNumBooths = function(demand) {
let arr = [];
for(let i = 0; i < demand.length; i++){
let m = {};
for(let j = 0; j < demand[i].length; j++){
m[demand[i][j]] = (m[demand[i][j]] || 0) + 1;
}
arr.push(m);
}
let map = {};
for(let i = 0; i < arr.length; i++){
for(let k in arr[i]){
map[k] = Math.max(map[k] || 0,arr[i][k]);
}
}
let res = 0;
for(let k in map){
res += map[k];
}
return res;
};
说在后面
🎉这里是JYeontu,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。