Skip to content

Commit 5699081

Browse files
committed
week 4 - find minimum in rotated sorted array
1 parent 612723f commit 5699081

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
class Solution:
2+
def findMin(self, nums: List[int]) -> int:
3+
# ์„ ํ˜• ํƒ์ƒ‰(linear scan) ๋ฒ„์ „
4+
5+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
6+
# - ๋ฐฐ์—ด ์ „์ฒด๋ฅผ ๋’ค์—์„œ ์•ž์œผ๋กœ ํ•œ ์นธ์”ฉ ์ˆœํšŒํ•˜๋ฉด์„œ
7+
# "ํšŒ์ „์ด ๋Š๊ธฐ๋Š” ์ง€์ "์„ ์ฐพ๋Š”๋‹ค.
8+
# - ์ตœ์•…์˜ ๊ฒฝ์šฐ n-1๋ฒˆ ๋น„๊ต.
9+
10+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
11+
# - ์ถ”๊ฐ€ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉ.
12+
13+
# ๋ฐฐ์—ด ๊ธธ์ด๊ฐ€ 1๊ฐœ๋ฉด ๊ทธ ๊ฐ’ ์ž์ฒด๊ฐ€ ์ตœ์†Ÿ๊ฐ’
14+
min_num = 0
15+
if len(nums) == 1:
16+
return nums[0]
17+
18+
# ๋’ค์—์„œ ์•ž์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉด์„œ
19+
# nums[i] < nums[i-1] ์ง€์ (ํšŒ์ „์ด ์ผ์–ด๋‚œ ์ง€์ )์„ ์ฐพ๋Š”๋‹ค.
20+
# ํ•ด๋‹น ์ง€์ ์˜ nums[i]๊ฐ€ ์ตœ์†Ÿ๊ฐ’
21+
for i in range(len(nums) - 1, -1, -1):
22+
if nums[i] < nums[i - 1]:
23+
min_num = nums[i]
24+
break
25+
26+
return min_num
27+
28+
def findMinBinarySearch(self, nums: List[int]) -> int:
29+
# ์ด์ง„ ํƒ์ƒ‰(binary search) ๋ฒ„์ „
30+
31+
# ์‹œ๊ฐ„ ๋ณต์žก๋„: O(log n)
32+
# - ์ •๋ ฌ๋œ ๋ฐฐ์—ด์ด ํ•œ ๋ฒˆ ํšŒ์ „(rotated)๋œ ํ˜•ํƒœ๋ฅผ ์ด์šฉํ•ด
33+
# ์ ˆ๋ฐ˜์”ฉ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ค„์ธ๋‹ค.
34+
# - mid ๊ธฐ์ค€ ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ ์–ด๋А ์ชฝ์ด ์ •๋ ฌ ์ƒํƒœ์ธ์ง€์— ๋”ฐ๋ผ ํƒ์ƒ‰ ๋ฐฉํ–ฅ ๊ฒฐ์ •
35+
36+
# ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
37+
# - ํฌ์ธํ„ฐ(l, h, mid)๋งŒ ์‚ฌ์šฉ
38+
39+
# l์€ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š”๋ฐ,
40+
# mid-1 ๋น„๊ต๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.
41+
l, h = 1, len(nums) - 1
42+
43+
while l <= h:
44+
mid = (l + h) // 2
45+
46+
# mid๊ฐ€ ์ตœ์†Ÿ๊ฐ’์ด ๋˜๋Š” ์ „ํ˜•์ ์ธ ์กฐ๊ฑด:
47+
# mid ๋ฐ”๋กœ ์ด์ „ ์š”์†Œ๊ฐ€ mid๋ณด๋‹ค ํฌ๋ฉด ํšŒ์ „ ์ง€์ 
48+
if nums[mid - 1] > nums[mid]:
49+
return nums[mid]
50+
51+
# nums[0] < nums[mid] -> ๋ฐฐ์—ด ์‹œ์ž‘์ ๋ถ€ํ„ฐ mid๊นŒ์ง€๋Š” ์ •๋ ฌ๋œ ์ƒํƒœ
52+
# โ†’ ํšŒ์ „ ์ง€์ ์€ ์˜ค๋ฅธ์ชฝ์— ์žˆ์Œ -> l์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™
53+
if nums[0] < nums[mid]:
54+
l = mid + 1
55+
else:
56+
# ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ ํšŒ์ „ ์ง€์ ์€ ์™ผ์ชฝ ๊ตฌ๊ฐ„์— ์กด์žฌ
57+
h = mid - 1
58+
59+
# ํšŒ์ „์ด ์•„์˜ˆ ์—†๋Š” ๊ฒฝ์šฐ(์™„์ „ ์ •๋ ฌ ์ƒํƒœ)
60+
return nums[0]
61+
62+
# def findMin(self, nums: List[int]) -> int:
63+
# # ํŒŒ์ด์ฌ์˜ ๋‚ด์žฅํ•จ์ˆ˜์ธ min์„ ์ด์šฉํ•ด๋„ ๋ฌธ์ œ ํ’€์ด ๊ฐ€๋Šฅ
64+
# # https://wiki.python.org/moin/TimeComplexity์•  ์˜ํ•˜๋ฉด min ํ•จ์ˆ˜๋„ O(n)์ž„
65+
# return min(nums)

0 commit comments

Comments
ย (0)