Skip to content

Commit cc007f4

Browse files
committed
solve(w14): 253. Meeting Rooms II
1 parent a49a4be commit cc007f4

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# https://leetcode.com/problems/meeting-rooms-ii/
2+
3+
from typing import List
4+
5+
class Solution:
6+
def minMeetingRooms_heap(self, intervals: List[List[int]]) -> int:
7+
"""
8+
[Complexity]
9+
- TC: O(nlogn) (sort & heappop/push)
10+
- SC: O(n) (min heap)
11+
12+
[Approach]
13+
๊ธฐ๋ณธ์ ์œผ๋กœ ํšŒ์˜ ์‹œ์ž‘ ์‹œ๊ฐ์ด ๋น ๋ฅธ ์ˆœ์„œ๋กœ ์‚ดํŽด๋ณด์•„์•ผ ํ•œ๋‹ค.
14+
์‹œ์ž‘ ์‹œ๊ฐ ์ด์ „์— ์–ด๋–ค ํšŒ์˜์‹ค์ด ๋นˆ๋‹ค๋ฉด ํ•ด๋‹น ํšŒ์˜์‹ค์„ ์ด์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ 
15+
์‹œ์ž‘ ์‹œ๊ฐ ์ดํ›„๊นŒ์ง€ ๊ธฐ์กด ํšŒ์˜๊ฐ€ ๋งˆ์น˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ•ด๋‹น ํšŒ์˜์‹ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
16+
์ด๋ฅผ ๋งค๋ฒˆ ๋น ๋ฅด๊ฒŒ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ๋ฆฌ๋””ํ•˜๊ฒŒ
17+
"์ด์ „๊นŒ์ง€ ํšŒ์˜์‹ค์„ ์‚ฌ์šฉํ•˜๋˜ ํšŒ์˜ ์ค‘ ๊ฐ€์žฅ ๋นจ๋ฆฌ ๋งˆ์น˜๋Š” ํšŒ์˜์˜ ์ข…๋ฃŒ ์‹œ๊ฐ"๊ณผ "ํ˜„์žฌ ๋ณด๊ณ  ์žˆ๋Š” ํšŒ์˜ ์‹œ์ž‘ ์‹œ๊ฐ"
18+
์„ ๋น„๊ตํ•˜๋ฉด ๋œ๋‹ค.
19+
ํ•ญ์ƒ ํšŒ์˜์˜ ์ข…๋ฃŒ ์‹œ๊ฐ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊ณ ๋ฅด๋ฉด ๋˜๋ฏ€๋กœ, min heap์„ ์ด์šฉํ•˜์—ฌ ์ตœ์†Ÿ๊ฐ’์„ O(1)์— ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
20+
"""
21+
import heapq
22+
23+
# ํšŒ์˜ ์‹œ์ž‘ ์‹œ๊ฐ ์ˆœ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
24+
intervals.sort()
25+
26+
# min heap
27+
rooms = []
28+
29+
for s, e in intervals:
30+
# "์ด์ „๊นŒ์ง€ ํšŒ์˜์‹ค์„ ์‚ฌ์šฉํ•˜๋˜ ํšŒ์˜ ์ค‘ ๊ฐ€์žฅ ๋นจ๋ฆฌ ๋งˆ์น˜๋Š” ํšŒ์˜์˜ ์ข…๋ฃŒ ์‹œ๊ฐ"๊ณผ "ํ˜„์žฌ ๋ณด๊ณ  ์žˆ๋Š” ํšŒ์˜ ์‹œ์ž‘ ์‹œ๊ฐ"์ด ๊ฒน์น˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ,
31+
# rooms์— ์กด์žฌํ•˜๋Š” ํšŒ์˜์‹ค ์ค‘ e๊ฐ€ ๊ฐ€์žฅ ์ด๋ฅธ ํšŒ์˜์‹ค pop
32+
if rooms and rooms[0] <= s:
33+
heapq.heappop(rooms)
34+
35+
# ํ˜„์žฌ ํšŒ์˜ push
36+
heapq.heappush(rooms, e)
37+
38+
return len(rooms)
39+
40+
def minMeetingRooms(self, intervals: List[List[int]]) -> int:
41+
"""
42+
[Complexity]
43+
- TC: O(nlogn)
44+
- SC: O(n)
45+
46+
[Approach]
47+
start์™€ end๋ฅผ ๋‚˜๋ˆ„์–ด ์ •๋ ฌํ•œ๋‹ค๋ฉด, ๊ฐ๊ฐ์˜ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” two-pointer๋ฅผ ์ด์šฉํ•ด
48+
ํšŒ์˜์‹ค์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์™€ ์ƒˆ๋กœ์šด ํšŒ์˜์‹ค์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.
49+
starts๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ e๋ผ๋Š” pointer๋กœ ends์˜ ์ฒซ๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ๋น„๊ตํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ€์ด์Šค๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
50+
- non-overlap(ends[e] <= s): ํšŒ์˜์‹ค ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ (e++๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ํšŒ์˜ ์‚ดํŽด๋ณด๊ธฐ)
51+
- overlap(ends[e] > s): ์ƒˆ๋กœ์šด ํšŒ์˜์‹ค ํ•„์š”
52+
"""
53+
starts = sorted(s for s, _ in intervals)
54+
ends = sorted(e for _, e in intervals)
55+
56+
res = e = 0
57+
58+
for s in starts:
59+
# non overlap -> ํšŒ์˜์‹ค ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ (๋‹ค์Œ ํšŒ์˜ ์‚ดํŽด๋ณด๊ธฐ)
60+
if ends[e] <= s:
61+
e += 1
62+
# overlap -> ์ƒˆ๋กœ์šด ํšŒ์˜์‹ค ํ•„์š”
63+
else:
64+
res += 1
65+
66+
return res

0 commit comments

Comments
ย (0)