Skip to content

Commit 34caf8e

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

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed
+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from typing import List
2+
3+
class Solution:
4+
def find_pivot_idx(self, src_list: List[int], start_idx: int, end_idx: int) -> int:
5+
if start_idx == end_idx:
6+
return start_idx
7+
mid_idx = (start_idx + end_idx) // 2
8+
if src_list[mid_idx] > src_list[end_idx]:
9+
return self.find_pivot_idx(src_list, mid_idx + 1, end_idx)
10+
else:
11+
return self.find_pivot_idx(src_list, start_idx, mid_idx)
12+
13+
14+
def find_target_idx(self, src_list: List[int], start_idx: int, end_idx: int, target) -> int:
15+
if start_idx > end_idx:
16+
return -1
17+
if start_idx == end_idx:
18+
if src_list[start_idx] == target:
19+
return start_idx
20+
else:
21+
return -1
22+
23+
mid_idx = (start_idx + end_idx) // 2
24+
if src_list[mid_idx] == target:
25+
return mid_idx
26+
elif src_list[mid_idx] > target:
27+
return self.find_target_idx(src_list, start_idx, mid_idx - 1, target)
28+
else:
29+
return self.find_target_idx(src_list, mid_idx + 1, end_idx, target)
30+
31+
32+
def search(self, nums: List[int], target: int) -> int:
33+
if nums[0] > nums[len(nums) - 1]:
34+
pivot_idx = self.find_pivot_idx(nums, 0, len(nums) - 1)
35+
left = self.find_target_idx(nums, 0, pivot_idx - 1, target)
36+
if left != -1:
37+
return left
38+
else:
39+
return self.find_target_idx(nums, pivot_idx, len(nums) - 1, target)
40+
else:
41+
return self.find_target_idx(nums, 0, len(nums) - 1, target)
42+

0 commit comments

Comments
 (0)