Skip to content

Commit 6f10dfd

Browse files
authored
[okyungjin] WEEK 14 Solutions (#2866)
* 338. Counting Bits * 102. Binary Tree Level Order Traversal * 213. House Robber II * 252. Meeting Rooms * 253. Meeting Rooms II
1 parent 8deb424 commit 6f10dfd

5 files changed

Lines changed: 166 additions & 0 deletions

File tree

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# 102. Binary Tree Level Order Traversal
2+
# https://leetcode.com/problems/binary-tree-level-order-traversal/
3+
4+
"""
5+
문제:
6+
- 이진 트리의 rootκ°€ μ£Όμ–΄μ§ˆ λ•Œ, λ…Έλ“œ 값을 레벨 μˆœμ„œ(μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½, μœ„μ—μ„œ μ•„λž˜)둜 λ¬Άμ–΄μ„œ λ°˜ν™˜ν•œλ‹€
7+
- κ²°κ³ΌλŠ” λ ˆλ²¨λ³„ κ°’ 리슀트의 리슀트 (예: [[3], [9, 20], [15, 7]])
8+
- 0 <= λ…Έλ“œ 수 <= 2000
9+
10+
λ³΅μž‘λ„:
11+
n: λ…Έλ“œμ˜ 개수
12+
Time: O(n)
13+
Space: O(n)
14+
"""
15+
# Definition for a binary tree node.
16+
# class TreeNode:
17+
# def __init__(self, val=0, left=None, right=None):
18+
# self.val = val
19+
# self.left = left
20+
# self.right = right
21+
class Solution:
22+
def levelOrder(self, root: TreeNode | None) -> list[list[int]]:
23+
if not root:
24+
return []
25+
26+
ans = []
27+
q = deque([(0, root)])
28+
while q:
29+
level, node = q.popleft()
30+
if len(ans) == level:
31+
ans.append([])
32+
ans[level].append(node.val)
33+
if node.left:
34+
q.append((level + 1, node.left))
35+
if node.right:
36+
q.append((level + 1, node.right))
37+
38+
return ans

β€Žcounting-bits/okyungjin.pyβ€Ž

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# 338. Counting Bits
2+
# https://leetcode.com/problems/counting-bits/
3+
4+
"""
5+
문제:
6+
- μ •μˆ˜ n이 μ£Όμ–΄μ§ˆ λ•Œ, 0λΆ€ν„° nκΉŒμ§€ 각 i에 λŒ€ν•΄ i의 이진 ν‘œν˜„μ— ν¬ν•¨λœ 1의 개수λ₯Ό κ΅¬ν•œλ‹€
7+
- κ²°κ³ΌλŠ” 길이 n + 1인 λ°°μ—΄ ans둜 λ°˜ν™˜ν•œλ‹€ (ans[i] = i의 1의 개수)
8+
- 0 <= n <= 10^5
9+
10+
λ³΅μž‘λ„:
11+
n: μž…λ ₯ μ •μˆ˜ n
12+
Time: O(n)
13+
Space: O(1)
14+
"""
15+
class Solution:
16+
def countBits(self, n: int) -> List[int]:
17+
dp = [0]
18+
offset = 1
19+
20+
for num in range(1, n + 1):
21+
if num == offset * 2:
22+
offset = num
23+
dp.append(dp[num - offset] + 1)
24+
25+
return dp

β€Žhouse-robber-ii/okyungjin.pyβ€Ž

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# 213. House Robber II
2+
# https://leetcode.com/problems/house-robber-ii/
3+
4+
"""
5+
문제:
6+
- 집듀이 μ›ν˜•μœΌλ‘œ λ°°μΉ˜λ˜μ–΄ 있고, 각 μ§‘μ—λŠ” 돈이 λ“€μ–΄ μžˆλ‹€.
7+
- μΈμ ‘ν•œ 두 집은 같은 λ‚  ν„Έ 수 μ—†λ‹€.
8+
- 첫 μ§‘κ³Ό λ§ˆμ§€λ§‰ 집도 μΈμ ‘ν•œ κ²ƒμœΌλ‘œ λ³Έλ‹€.
9+
- ν„Έ 수 μžˆλŠ” μ΅œλŒ€ κΈˆμ•‘μ„ κ΅¬ν•œλ‹€.
10+
11+
λ³΅μž‘λ„:
12+
n: `nums`의 길이
13+
Time: O(n)
14+
Space: O(1)
15+
"""
16+
class Solution:
17+
def rob(self, nums: List[int]) -> int:
18+
n = len(nums)
19+
if n == 1:
20+
return nums[0]
21+
22+
def steel(start, end):
23+
prev2, prev1 = 0, 0
24+
for i in range(start, end):
25+
cur = max(prev2 + nums[i], prev1)
26+
prev2, prev1 = prev1, cur
27+
return prev1
28+
29+
s1 = steel(0, n - 1)
30+
s2 = steel(1, n)
31+
return max(s1, s2)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# 253. Meeting Rooms II
2+
# https://www.lintcode.com/problem/919/
3+
4+
"""
5+
문제:
6+
- 회의 μ‹œκ°„ ꡬ간 `[start, end)` λͺ©λ‘μ΄ μ£Όμ–΄μ§„λ‹€. (start < end)
7+
- λͺ¨λ“  회의λ₯Ό μ§„ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ μ΅œμ†Œ νšŒμ˜μ‹€ 개수λ₯Ό κ΅¬ν•œλ‹€.
8+
- ν•œ νšŒμ˜κ°€ λλ‚˜λŠ” μ‹œκ°μ— λ‹€λ₯Έ νšŒμ˜κ°€ μ‹œμž‘ν•˜λŠ” 것은 좩돌이 μ•„λ‹ˆλ‹€.
9+
10+
λ³΅μž‘λ„:
11+
n: `intervals`의 길이
12+
Time: O(n log n)
13+
Space: O(n)
14+
"""
15+
import heapq
16+
17+
"""
18+
Definition of Interval:
19+
class Interval(object):
20+
def __init__(self, start, end):
21+
self.start = start
22+
self.end = end
23+
"""
24+
class Solution:
25+
def min_meeting_rooms(self, intervals: List[Interval]) -> int:
26+
pq = []
27+
intervals.sort(key=lambda x: x.start)
28+
29+
for cur in intervals:
30+
if pq:
31+
earliest_end = pq[0] # μ—΄λ¦° λ°©λ“€ 쀑 κ°€μž₯ 빨리 λλ‚˜λŠ” μ‹œκ°
32+
if cur.start >= earliest_end:
33+
heapq.heappop(pq)
34+
heapq.heappush(pq, cur.end)
35+
36+
return len(pq)
37+
38+
# print(Solution().min_meeting_rooms([Interval(0, 30), Interval(5, 10), Interval(15, 20)])) # 2
39+
# print(Solution().min_meeting_rooms([Interval(0, 5), Interval(5, 10), Interval(10, 15)])) # 1
40+
# print(Solution().min_meeting_rooms([Interval(1, 10), Interval(2, 7), Interval(3, 9), Interval(8, 12)])) # 3

β€Žmeeting-rooms/okyungjin.pyβ€Ž

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# 252. Meeting Rooms
2+
# https://www.lintcode.com/problem/920/
3+
4+
"""
5+
문제:
6+
- 회의 μ‹œκ°„ ꡬ간 `[start, end)` λͺ©λ‘μ΄ μ£Όμ–΄μ§„λ‹€. (start < end)
7+
- ν•œ μ‚¬λžŒμ΄ λͺ¨λ“  νšŒμ˜μ— 참석할 수 μžˆλŠ”μ§€ True/False둜 λ°˜ν™˜ν•œλ‹€.
8+
- ν•œ νšŒμ˜κ°€ λλ‚˜λŠ” μ‹œκ°μ— λ‹€λ₯Έ νšŒμ˜κ°€ μ‹œμž‘ν•˜λŠ” 것은 좩돌이 μ•„λ‹ˆλ‹€.
9+
10+
λ³΅μž‘λ„:
11+
n: `intervals`의 길이
12+
Time: O(n log n)
13+
Space: O(n)
14+
"""
15+
16+
"""
17+
Definition of Interval:
18+
class Interval(object):
19+
def __init__(self, start, end):
20+
self.start = start
21+
self.end = end
22+
"""
23+
class Solution:
24+
def can_attend_meetings(self, intervals: List[Interval]) -> bool:
25+
intervals.sort(key=lambda x: x.end)
26+
27+
last_end = 0
28+
for interval in intervals:
29+
if interval.start < last_end:
30+
return False
31+
last_end = interval.end
32+
return True

0 commit comments

Comments
Β (0)