携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情 >>
最小未被占据椅子的编号
有 n 个朋友在举办一个派对,这些朋友从 0 到 n - 1 编号。派对里有 无数 张椅子,编号为 0 到 infinity 。当一个朋友到达派对时,他会占据 编号最小 且未被占据的椅子。
- 比方说,当一个朋友到达时,如果椅子 0 ,1 和 5 被占据了,那么他会占据 2 号椅子。 当一个朋友离开派对时,他的椅子会立刻变成未占据状态。如果同一时刻有另一个朋友到达,可以立即占据这张椅子。
给你一个下标从 0 开始的二维整数数组 times ,其中 times[i] = [arrivali, leavingi] 表示第 i 个朋友到达和离开的时刻,同时给你一个整数 targetFriend 。所有到达时间 互不相同 。
请你返回编号为 targetFriend 的朋友占据的 椅子编号 。
示例1:
输入:times = [[1,4],[2,3],[4,6]], targetFriend = 1
输出:1
解释:
- 朋友 0 时刻 1 到达,占据椅子 0 。
- 朋友 1 时刻 2 到达,占据椅子 1 。
- 朋友 1 时刻 3 离开,椅子 1 变成未占据。
- 朋友 0 时刻 4 离开,椅子 0 变成未占据。
- 朋友 2 时刻 4 到达,占据椅子 0 。
朋友 1 占据椅子 1 ,所以返回 1 。
示例2:
输入:times = [[3,10],[1,5],[2,6]], targetFriend = 0
输出:2
解释:
- 朋友 1 时刻 1 到达,占据椅子 0 。
- 朋友 2 时刻 2 到达,占据椅子 1 。
- 朋友 0 时刻 3 到达,占据椅子 2 。
- 朋友 1 时刻 5 离开,椅子 0 变成未占据。
- 朋友 2 时刻 6 离开,椅子 1 变成未占据。
- 朋友 0 时刻 10 离开,椅子 2 变成未占据。
朋友 0 占据椅子 2 ,所以返回 2 。
提示:
- n == times.length
- 2 <= n <= 104
- times[i].length == 2
- 1 <= arrivali < leavingi <= 105
- 0 <= targetFriend <= n - 1
- 每个 arrivali 时刻 互不相同 。
解题思路:
1. 每项时间times[i]绑定朋友i, 按照到达时间排序.
2. 创建座位数组和记录朋友坐的凳子位号。
3. 当朋友到达(arr[i].type === 'arrival') 记录位置;离去时清空座位数据。
4. 当指定的朋友(targetFriend)到达时就可以停止循环
我的答案:
/**
* @param {number[][]} times
* @param {number} targetFriend
* @return {number}
*/
var smallestChair = function(times, targetFriend) {
let arr = []
let len = times.length
times = times.map((item, index) => {
return [...item, index]
})
times.sort((a, b) => a[0] - b[0])
for (let i = 0; i < len; i++) {
arr.push({
person: times[i][2],
type: 'arrival',
time: times[i][0]
})
arr.push({
person: times[i][2],
type: 'leaving',
time: times[i][1]
})
}
arr.sort((a, b) => a.time - b.time)
let seatArr = new Array(len).fill(null)
let personSeat = {}
for (let i = 0; i < arr.length; i++) {
if (arr[i].type == 'arrival') {
let index = seatArr.indexOf(null)
personSeat[arr[i].person] = index
seatArr[index] = arr[i]
} else {
seatArr[personSeat[arr[i].person]] = null
}
if (arr[i].person === targetFriend) break
}
return personSeat[targetFriend]
};
最后
如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )