Skip to content

Commit 1b2a8a9

Browse files
committed
solve(w10): 33. Search in Rotated Sorted Array
1 parent 29c744c commit 1b2a8a9

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# https://leetcode.com/problems/search-in-rotated-sorted-array/
2+
3+
from typing import List
4+
5+
class Solution:
6+
def search_1(self, nums: List[int], target: int) -> int:
7+
"""
8+
[Complexity]
9+
- TC: O(logn)
10+
- SC: O(1)
11+
12+
[Approach]
13+
sorted array를 다루면서 O(log n) time에 수행되어야 하므로 binary search를 사용해야 한다.
14+
기본적으로 sorted array이므로, rotated 되었더라도 mid를 기준으로 한 쪽은 무조건 sorted이다.
15+
그리고 sorted인 부분에 target이 존재하는지 여부는 양끝 값과만 비교하더라도 알 수 있다.
16+
따라서 다음의 두 가지 경우로 나누어 볼 수 있다.
17+
1) 왼쪽이 sorted
18+
-> target이 왼쪽에 포함되면 왼쪽으로, 아니라면 오른쪽으로
19+
2) 오른쪽이 sorted
20+
-> target이 오른쪽에 포함되면 오른쪽으로, 아니라면 왼쪽으로
21+
"""
22+
lo, hi = 0, len(nums) - 1
23+
24+
while lo < hi:
25+
mid = (lo + hi) // 2
26+
27+
# 1) 왼쪽이 sorted
28+
if nums[lo] <= nums[mid]:
29+
# target이 왼쪽에 포함되면 왼쪽 살펴보기
30+
if nums[lo] <= target <= nums[mid]:
31+
hi = mid
32+
# 아니라면 오른쪽 살펴보기
33+
else:
34+
lo = mid + 1
35+
# 2) 오른쪽이 sorted
36+
else:
37+
# target이 오른쪽에 포함되면 오른쪽 살펴보기
38+
if nums[mid] < target <= nums[hi]:
39+
lo = mid + 1
40+
# 아니라면 왼쪽 살펴보기
41+
else:
42+
hi = mid
43+
44+
return hi if nums[hi] == target else -1
45+
46+
def search(self, nums: List[int], target: int) -> int:
47+
"""
48+
[Complexity]
49+
- TC: O(logn)
50+
- SC: O(1)
51+
52+
[Approach]
53+
앞의 풀이에서 더 명시적으로 경계 조건을 판단하도록 수정할 수 있다. (nums[mid] == target이라면 바로 반환)
54+
"""
55+
lo, hi = 0, len(nums) - 1
56+
57+
while lo <= hi:
58+
mid = (lo + hi) // 2
59+
60+
# nums[mid] == target인 경우 곧바로 반환 (명시적)
61+
if nums[mid] == target:
62+
return mid
63+
64+
# 1) 왼쪽이 sorted
65+
if nums[lo] <= nums[mid]:
66+
# target이 왼쪽에 포함되면 왼쪽 살펴보기
67+
if nums[lo] <= target < nums[mid]:
68+
hi = mid - 1
69+
# 아니라면 오른쪽 살펴보기
70+
else:
71+
lo = mid + 1
72+
# 2) 오른쪽이 sorted
73+
else:
74+
# target이 오른쪽에 포함되면 오른쪽 살펴보기
75+
if nums[mid] < target <= nums[hi]:
76+
lo = mid + 1
77+
# 아니라면 왼쪽 살펴보기
78+
else:
79+
hi = mid - 1
80+
81+
return -1

0 commit comments

Comments
 (0)