File tree 5 files changed +196
-0
lines changed
search-in-rotated-sorted-array
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