๐ ๋ชฉ์ฐจ
๐ค ๋ฌธ์ : Longest Palindromic Substring | LeetCode 780
์ฃผ์ด์ง ๋ฐฐ์ด์ ์ ๋ ฌํ๋ ๋ฌธ์ ์ ๋๋ค.
๋จ, ์ด ๋ฌธ์ ์์ ๋ฐฐ์ด์ ๊ฐ์ 0,1,2์ค ํ๋์ ๋๋ค.
quick sort๋ฅผ ํ์ฉํ๋ค๋ฉด O(NlogN) ์ด ๊ฑธ๋ฆฌ๊ฒ ์ง๋ง, ๋ฐฐ์ด์ ๊ฐ์ด ์ ํด์ ธ์๋ค๋ ์ ์ ํ์ฉํ์ฌ ๋ ๋น ๋ฅด๊ฒ ํ ์ ์์ต๋๋ค.
๐ก ํ์ด
1. hashMapํ์ฉ, 0,1,2์ ๊ฐฏ์ count
๋ฐฐ์ด์์ ๋์ค๋ ๊ฐ์ ์ด๋ฏธ ์๊ณ ์๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ํ์ฉํด๋ด ๋๋ค.
nums๋ฅผ ์ฝ์ผ๋ฉฐ 0,1,2์ ๊ฐฏ์๋ฅผ ์ ์ฅํ๊ณ ,
ํ๋ฒ ๋ ์ํํ๋ฉฐ ๊ฐฏ์๋๋ก ์ธํ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
class Solution:
def sortColors(self, nums: List[int]) -> None:
counts = {0: 0, 1: 0, 2: 0}
for item in nums:
counts[item] += 1
index = 0
for i in range(3):
while counts[i] > 0:
nums[index] = i
index += 1
counts[i] -= 1โ
๋ฐฐ์ด์ ์ด 2๋ฒ ์ํํ๊ณ , hashmap ํฌ๊ธฐ๋งํผ์ ์ ์ฅ๊ณต๊ฐ์ ๋ ์ฌ์ฉํฉ๋๋ค.
Time Complexity
O(N)
Space Complexity
O(1)
2. one-pass algorithm
๋ฌธ์ ์ ์ด๋ฐ ๋จ์๊ฐ ๋ฌ๋ ค์์ต๋๋ค.
Follow up: Could you come up with a one-pass algorithm using only constant extra space?
- 0์ ์์์๋ถํฐ ์ฑ์๋๊ฐ๋ฉฐ, 0์ด ์ฑ์์ง ์ธ๋ฑ์ค ๊ธฐ๋ก (frontIdx)
- 0์ด ๋์ค๋ฉด frontIdx์ ๊ฐ๊ณผ swap
- 2์ ๋ค์์๋ถํฐ ์ฑ์๋๊ฐ๋ฉฐ, 2๊ฐ ์ฑ์์ง ์ธ๋ฑ์ค ๊ธฐ๋ก (backIdx)
- 2๊ฐ ๋์ค๋ฉด backIdx ๊ฐ๊ณผ swap
class Solution:
def sortColors(self, nums: List[int]) -> None:
backIdx = len(nums) - 1
frontIdx = 0
currIdx = 0
while 1:
if currIdx > backIdx: break
if nums[currIdx] is 0:
nums[frontIdx], nums[currIdx] = nums[currIdx], nums[frontIdx]
frontIdx += 1
if nums[currIdx] is 2:
nums[backIdx], nums[currIdx] = nums[currIdx], nums[backIdx]
backIdx -= 1
currIdx -= 1 [1] ์ฃผ์!
currIdx += 1
print(nums)
[1] 2๋ฅผ swapํ๊ณ ๋๋ฉด currIdx์๋ฆฌ์ ๊ฐ์ ๋ญ๊ฐ ๋ค์ด์ฌ ์ง ์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์, ํด๋น ๊ฐ์ ๋ค์ ๋ด์ฃผ๊ธฐ ์ํด -1ํด์ค๋๋ค.
time complexity๋ ๋์ผํ๊ฒ O(N)์ด์ง๋ง, ์ ์ฒด ๋ฐฐ์ด์ ํ ๋ฒ๋ง ์ํํ๋ฉด ๋๋ฏ๋ก ์ํ์๋๋ ์กฐ๊ธ ๋ ๋นจ๋ผ์ง๋๋ค.
3. 2๋ฒ ์ด์ง ๊ฐ์ ,,
2๋ฒ ํ์ด์์ 2๊ฐ์ง๋ฅผ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
- nums์ ์๋ถ๋ถ์ด 0์ธ ๊ฒฝ์ฐ skip
- nums์ ๋ท๋ถ๋ถ์ด 1์ธ ๊ฒฝ์ฐ skip
- 0๊ณผ 0์ swapํ๋ ๊ฒฝ์ฐ skip
class Solution:
def sortColors(self, nums: List[int]) -> None:
if not nums: return nums
backIdx = len(nums) - 1
frontIdx = 0
currIdx = 0
while frontIdx <= backIdx and nums[frontIdx] is 0 : frontIdx += 1
while frontIdx <= backIdx and nums[backIdx] is 2: backIdx -= 1
currIdx = frontIdx
while currIdx <= backIdx:
if nums[currIdx] is 0:
if currIdx is not frontIdx:
nums[frontIdx], nums[currIdx] = nums[currIdx], nums[frontIdx]
frontIdx += 1
if nums[currIdx] is 2:
nums[backIdx], nums[currIdx] = nums[currIdx], nums[backIdx]
backIdx -= 1
currIdx -= 1
currIdx += 1
์๋ ํ์ด๋ค๋ผ๋ฆฌ ์ํ์๋ ์ฐจ์ด๊ฐ ๋ฏธ๋ฏธํด์์ธ์ง, ์ด๋ ๊ฒ ๋ฐ๊ฟจ๋๋ 93%๋ก ์ฌ๋ผ๊ฐ๋ค์.
'์๊ณ ๋ฆฌ์ฆ > LEETCODE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Merge Intervals | LeetCode 803 | Python3 ๐ (0) | 2022.03.10 |
---|---|
Search for a Range | LeetCode 802 | Python3 ๐ (0) | 2022.03.09 |
Permutations, Subsets | LeetCode | Python3 ๐ (0) | 2022.03.05 |
Generate Parentheses | LeetCode 780 | Python3 ๐ (0) | 2022.03.02 |
Letter Combinations of a Phone Number | LeetCode 793 | Python3 ๐ (0) | 2022.03.01 |