Skip to content

Commit 3f3a994

Browse files
committed
feat: search-in-rotated-sorted-array
1 parent 5d96078 commit 3f3a994

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from typing import List
2+
3+
# 시간 복잡도 : O(log n) (* 최대 세번의 이진 탐색 수행)
4+
# 공간 복잡도 : O(1)
5+
class Solution:
6+
def find_pivot_idx(self, src_list: List[int], start_idx: int, end_idx: int) -> int:
7+
if start_idx == end_idx:
8+
return start_idx
9+
mid_idx = (start_idx + end_idx) // 2
10+
if src_list[mid_idx] > src_list[end_idx]:
11+
return self.find_pivot_idx(src_list, mid_idx + 1, end_idx)
12+
else:
13+
return self.find_pivot_idx(src_list, start_idx, mid_idx)
14+
15+
16+
def find_target_idx(self, src_list: List[int], start_idx: int, end_idx: int, target) -> int:
17+
if start_idx > end_idx:
18+
return -1
19+
if start_idx == end_idx:
20+
if src_list[start_idx] == target:
21+
return start_idx
22+
else:
23+
return -1
24+
25+
mid_idx = (start_idx + end_idx) // 2
26+
if src_list[mid_idx] == target:
27+
return mid_idx
28+
elif src_list[mid_idx] > target:
29+
return self.find_target_idx(src_list, start_idx, mid_idx - 1, target)
30+
else:
31+
return self.find_target_idx(src_list, mid_idx + 1, end_idx, target)
32+
33+
34+
def search(self, nums: List[int], target: int) -> int:
35+
if nums[0] > nums[len(nums) - 1]:
36+
pivot_idx = self.find_pivot_idx(nums, 0, len(nums) - 1)
37+
left = self.find_target_idx(nums, 0, pivot_idx - 1, target)
38+
if left != -1:
39+
return left
40+
else:
41+
return self.find_target_idx(nums, pivot_idx, len(nums) - 1, target)
42+
else:
43+
return self.find_target_idx(nums, 0, len(nums) - 1, target)
44+

0 commit comments

Comments
 (0)