File tree Expand file tree Collapse file tree 5 files changed +196
-0
lines changed
search-in-rotated-sorted-array Expand file tree Collapse file tree 5 files changed +196
-0
lines changed Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments