๐ ๋ชฉ์ฐจ
๐ค ๋ฌธ์ : Search in Rotated Sorted Array | LeetCode 804
์ ๋ ฌ๋ ๋ฐฐ์ด์์ ํ๊ฒ ์ซ์์ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋ ๋ฌธ์ ์ ๋๋ค.
๋จ, ์ฌ๊ธฐ์ ๋ฐฐ์ด์ rotated ๋์ด์์ต๋๋ค.
์๋ฅผ๋ค์ด,
[0,1,2,4,5,6,7]
๋ฐฐ์ด์ ์ค๋ฅธ์ชฝ์ผ๋ก 4์นธ ์ฎ๊ฒจ
[4,5,6,7,0,1,2]
๋ฅผ ๋ง๋๋ ์์ ๋๋ค.
๐ก ํ์ด
1. Rotate ๋ ์์์ ์ ์ฐพ์ ํ ํ์ชฝ ๋ฒ์์์ BS
๊ฐ์ฅ ๋จผ์ ๋ ์ฌ๋ฆฐ ํ์ด๋ ์ด๋๋ถ๋ถ๋ถํฐ Rotate๋ ๊ฒ์ธ์ง, pivot์ ์ฐพ์๋ ๊ฑฐ์์ต๋๋ค.
nums = [4,5,6,7,0,1,2], target = 0
์ด ์ผ์ด์ค์ ๊ฒฝ์ฐ 7๊ณผ 0 ์ฌ์ด๊ฐ rotate ๋ ๊ฑฐ๊ฒ ์ฃ ?
๊ทธ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด์ ๋๋ก ๋๋๋๋ค.
1) [ 4, 5, 6, 7 ]
2) [ 0, 1, 2 ]
๊ฐ๊ฐ์ ๋ฐฐ์ด์ ์ ์ ๋ ฌ๋ ๋ฐฐ์ด์ด๋ Binary Search๋ฅผ ์ธ ์ ์์ฃ .
๋ ์ค ํ๊ฒ์ ํฌํจํ๋ ๋ฒ์์ธ 2) ๋ฐฐ์ด์ ๋ํด์ Binary Search๋ฅผ ์ ์ฉํ์ฌ ํ๊ฒ๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ฐพ์ผ๋ฉด ๋ฉ๋๋ค.
class Solution:
def search(self, nums: List[int], target: int) -> int:
if not nums: return -1
if len(nums) == 1: return 0 if target == nums[0] else -1
def bsPivot(st, ed): # rotated ์ง์ ์ ์ฐพ๊ธฐ ์ํ Binary Search
md = int((st+ed)/2)
if nums[md] > nums[md+1] : return md
if nums[md] >= nums[st]: return bsPivot(md+1, ed)
return bsPivot(st, md-1)
def bs(st, ed): # ํ๊ฒ์ ์ฐพ๊ธฐ ์ํ Binary Search
# print("bs", st, ed)
if st > ed: return -1
md = int((st+ed)/2)
if nums[md] == target: return md
if nums[md] > target: return bs(st, md-1)
return bs(md+1, ed)
pivot = len(nums)-1 if nums[-1] > nums[0] else bsPivot(0, len(nums)-1)
# print(pivot)
if nums[0] <= target: return bs(0, pivot)
else: return bs(pivot+1, len(nums)-1)
Time Complexity
logN(pivot์ฐพ๊ธฐ) + logN
O(logN)
์ฑ๋ฅ์ด ๋ฌด์ฒ ๋ณ๋ก๋ค์.. ์๋ฌด๋๋ ๋ ์ข์ ํ์ด๊ฐ ์๋๋ด ๋๋ค.
2. BS๋ฅผ ๋ฐ๋ก ์ ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น?
์ฒซ๋ฒ์งธ ํ์ด๋ ์๋ฌด๋๋ ๋ฐฐ์ด์ ํ ๋ฒ ์ํํ๋ฉฐ rotate ์ง์ ์ ์ฐพ์์ผ ํ๋ n์ด ์์๋ฉ๋๋ค.
(rorate์ง์ ์ binary search๋ก ์ฐพ์์๋ ์์ง๋ง.. ์คํ๋ ค ์ฐ์ฐ์ด ๋ณต์กํ์ฌ ๋ ๋๋ฆฌ๋๋ผ๊ตฌ์)
rotate์ง์ ์ ์ฐพ์ง ์๊ณ ๋ฐ๋ก BS๋ฅผ ์ ์ฉํ ์ ์๋ ๋ก์ง์ด ์์๊น์?
BS์ ํน์ง์ ์ฃผ์ด์ง ๋ฐฐ์ด์ ๋ฒ์๋ฅผ ๋ฐ์ฉ ์ค์ฌ๊ฐ๋ฉฐ ํ๊ฒ๊ฐ์ ์ฐพ๋๊ฒ์ ๋๋ค.
rotated ๋ฐฐ์ด์ ๊ฒฝ์ฐ ๋ฒ์๋ฅผ ๋ฐ์ผ๋ก ๋๋ ๋ฐฐ์ด ๋๊ฐ๋ก ๋ง๋ค๋ฉด,
1) ์ ์ ๋ ฌ๋ ๋ฐฐ์ด - ์ฒซ๊ฐ์ด ๋ง์ง๋ง๊ฐ๋ณด๋ค ์์
2) rotated ๋ฐฐ์ด - ์ฒซ ๊ฐ์ด ๋ง์ง๋ง๊ฐ๋ณด๋ค ํผ
์ด๋ ๊ฒ ๋๋ ์ง๊ฒ ๋ฉ๋๋ค.
[ 4, 5, 6, 7, 0, 1, 2 ]
[ 4, 5, 6] [7, 0, 1, 2]
X [7, 0][1, 2]
0 X
1) ๋ฐฐ์ด์์ ํ๊ฒ ๋ฒ์๋ฅผ ํฌํจํ ๊ฐ๋ฅ์ฑ์ด ์๋์ง๋ ๊ฐ๋จํ ํ์ธํ ์ ์์ฃ ?
1) ๋ฐฐ์ด์ด ํ๊ฒ ๋ฒ์๋ฅผ ํฌํจํ๋ค๋ฉด 1)์ ๋ํด BS๋ฅผ ์ํํ๊ณ
๊ทธ๋ ์ง ์๋ค๋ฉด 2)์ ๋ํด BS๋ฅผ ์ํํ๋ ๋ฐฉ์์ผ๋ก ํ๋ฉด ๋๊ฒ ๋ค์.
class Solution:
def search(self, nums: List[int], target: int) -> int:
if not nums: return -1
if len(nums) == 1: return 0 if target == nums[0] else -1
def bs(st, ed):
# print(st, ed)
if st > ed: return -1
md = int((st+ed)/2)
if nums[md] == target: return md
# ์ผ์ชฝ์ ๋ฐ๋ฅด๊ฒ ์ ๋ ฌ๋จ
if nums[md] >= nums[st]:
if nums[st] <= target <= nums[md]: return bs(st, md-1)
else: return bs(md+1, ed)
# ์ค๋ฅธ์ชฝ์ ๋ฐ๋ฅด๊ฒ ์ ๋ ฌ๋จ
else:
if nums[md] <= target <= nums[ed]: return bs(md+1, ed)
else: return bs(st, md-1)
return bs(0, len(nums)-1)
Time Complexity
O(logN)
'์๊ณ ๋ฆฌ์ฆ > LEETCODE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Divide Two Integers | LeetCode 820 | Python3 ๐ (0) | 2022.03.15 |
---|---|
Search a 2D Matrix II | LeetCode 806 | Python3 ๐ (0) | 2022.03.14 |
Coin Change | LeetCode 809 | Python3 ๐ (0) | 2022.03.11 |
Merge Intervals | LeetCode 803 | Python3 ๐ (0) | 2022.03.10 |
Search for a Range | LeetCode 802 | Python3 ๐ (0) | 2022.03.09 |