Skip to content

Commit e57e52c

Browse files
authoredFeb 16, 2025
Merge pull request #1023 from Chaedie/main
[Chaedie] Week 10
2 parents 86a3ad9 + 97ef058 commit e57e52c

File tree

5 files changed

+196
-0
lines changed

5 files changed

+196
-0
lines changed
 

‎course-schedule/Chaedie.py

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
"""
2+
(해설을 보면서 따라 풀었습니다.)
3+
4+
Solution: graph 에서 circular 가 생기면 false, 아니면 true
5+
6+
n: numCourses
7+
p: number of preRequisites
8+
Time: O(n + p)
9+
Space: O(n + p)
10+
"""
11+
12+
13+
class Solution:
14+
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
15+
graph = {i: [] for i in range(numCourses)}
16+
for crs, pre in prerequisites:
17+
graph[crs].append(pre)
18+
19+
traversing = set()
20+
finished = set()
21+
22+
def dfs(crs):
23+
if crs in traversing:
24+
return False
25+
if crs in finished:
26+
return True
27+
28+
traversing.add(crs)
29+
for pre in graph[crs]:
30+
if not dfs(pre):
31+
return False
32+
traversing.remove(crs)
33+
finished.add(crs)
34+
return True
35+
36+
for crs in graph:
37+
if not dfs(crs):
38+
return False
39+
return True

‎invert-binary-tree/Chaedie.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"""
2+
Time: O(n)
3+
Space: O(n)
4+
"""
5+
6+
7+
class Solution:
8+
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
9+
if not root:
10+
return None
11+
12+
temp = root.right
13+
root.right = self.invertTree(root.left)
14+
root.left = self.invertTree(temp)
15+
16+
return root

‎jump-game/Chaedie.py

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
class Solution:
2+
"""
3+
Solution 1:
4+
뒤에서 부터 푸는 방법이 있을거라 생각했습니다.
5+
풀이는 성공했지만 성능은 느린 5% 라는 느린 성능을 보입니다.
6+
7+
Time: O(n * 10^5) - 10^5 는 nums 원소의 최대 값
8+
Space: O(n)
9+
"""
10+
11+
def canJump(self, nums: List[int]) -> bool:
12+
dp = [False for i in range(len(nums))]
13+
14+
dp[len(nums) - 1] = True
15+
16+
for i in range(len(nums) - 1 - 1, -1, -1):
17+
for j in range(1, nums[i] + 1):
18+
if i + j < len(nums) and dp[i + j]:
19+
dp[i] = True
20+
break
21+
22+
return dp[0]
23+
24+
"""
25+
Solution 2:
26+
Greedy - 솔루션을 참고했습니다.
27+
28+
Time: O(n)
29+
Space: O(1)
30+
"""
31+
32+
def canJump(self, nums: List[int]) -> bool:
33+
reach = 0
34+
for idx in range(len(nums)):
35+
if idx <= reach:
36+
reach = max(reach, idx + nums[idx])
37+
return reach >= len(nums) - 1

‎merge-k-sorted-lists/Chaedie.py

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""
2+
Solution:
3+
1) 모든 linked list 의 value 를 arr에 담는다.
4+
2) arr 를 정렬한다.
5+
3) arr 로 linked list 를 만든다.
6+
7+
Time: O(n log(n)) = O(n) arr 만들기 + O(n log(n)) 정렬하기 + O(n) linked list 만들기
8+
Space: O(n)
9+
"""
10+
11+
12+
class Solution:
13+
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
14+
arr = []
15+
for linked_list in lists:
16+
while linked_list:
17+
arr.append(linked_list.val)
18+
linked_list = linked_list.next
19+
20+
dummy = ListNode()
21+
node = dummy
22+
23+
arr.sort()
24+
for num in arr:
25+
node.next = ListNode(num)
26+
node = node.next
27+
return dummy.next
+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
"""
2+
1) binary search 로 pivot 찾아 2번 binary search 하기
3+
Time: O(log(n))
4+
Space: O(1)
5+
"""
6+
7+
8+
class Solution:
9+
def search(self, nums: List[int], target: int) -> int:
10+
11+
def find_pivot():
12+
low, high = 0, len(nums) - 1
13+
while low <= high:
14+
mid = (low + high) // 2
15+
if mid > 0 and nums[mid - 1] >= nums[mid]:
16+
return mid
17+
if nums[0] <= nums[mid]:
18+
low = mid + 1
19+
else:
20+
high = mid - 1
21+
return 0
22+
23+
def binary_search(low, high):
24+
while low <= high:
25+
mid = (low + high) // 2
26+
if nums[mid] == target:
27+
return mid
28+
if nums[mid] < target:
29+
low = mid + 1
30+
else:
31+
high = mid - 1
32+
return -1
33+
34+
pivot = find_pivot()
35+
36+
idx = binary_search(0, pivot - 1)
37+
return idx if idx > -1 else binary_search(pivot, len(nums) - 1)
38+
39+
40+
"""
41+
2) binary search
42+
left sorted case
43+
4 5 6 7 0 1 2 3
44+
m
45+
left target case
46+
right target case
47+
48+
right sorted case
49+
6 7 0 1 2 3 4 5
50+
m
51+
left target case
52+
right target case
53+
Time: O(log(n))
54+
Space: O(1)
55+
"""
56+
57+
58+
class Solution:
59+
def search(self, nums: List[int], target: int) -> int:
60+
61+
low, high = 0, len(nums) - 1
62+
while low <= high:
63+
mid = (low + high) // 2
64+
if target == nums[mid]:
65+
return mid
66+
67+
if nums[low] <= nums[mid]:
68+
if nums[low] <= target <= nums[mid]:
69+
high = mid - 1
70+
else:
71+
low = mid + 1
72+
else:
73+
if nums[mid] <= target <= nums[high]:
74+
low = mid + 1
75+
else:
76+
high = mid - 1
77+
return -1

0 commit comments

Comments
 (0)