Leetcode - Merge Sorted Array
์๊ณ ๋ฆฌ์ฆ ๊ณต๋ถ
๋ฆฌํธ์ฝ๋๋ฅผ ํ์ด๋ณด๋ ค ํ๋ค. ๋ผ์ด๋ธ ์ฝํ ๋๋น์ฉ์ผ๋ก ๋ง์ด๋ค. ์ผ๋จ ๋ชฉํ๋ 3๋ฌ ์์ Top 150 ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ์ด๋ค. ๋ฌธ์ ํ์ด๋ณด์.
โณ๏ธ Naive Approach.
์๊ฐ๋ณต์ก๋์ ๊ณต๊ฐ๋ณต์ก๋๋ฅผ ๊ณ ๋ ค ์ํ๊ณ ๊ฐ์ฅ ๋จ์ํ ๋ฐฉ๋ฒ์ผ๋ก ๋จผ์ ํ์ด๋ณด์.
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
# Naive
ptr = m
for num in nums2:
nums1[ptr] = num
ptr += 1
nums1.sort()
# TC: O((m+n)log(m+n))
# SC: O(1)
์ผ๋จ nums1
๋ฐฐ์ด์ nums2
์์๋ค์ ๋ชจ๋ ์ฎ๊ฒจ์ฃผ๊ณ sort() ํจ์๋ฅผ ํตํด ์ ๋ ฌ์ ์งํํ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ํ์ ๋ Time Complexity : O((m+n)log(m+n))
์ด๋ฉฐ Space Complexity
๋ O(1)
์ด๋ค.
์ด ์ฝ๋์ TC๋ฅผ ๋ ์ค์ด๋ ๋ฐฉ๋ฒ์ด ์์๊น?
โ๏ธ Best Approach
ํํธ๋ก ์ฃผ์ด์ง ์ ๋ค
- ๋ฐ์ดํฐ๋ ์ค๋ฆ์ฐจ์์ผ๋ก ์ด๋ฏธ ์ ๋ ฌ๋์ด ์๋ค.
- ์ถ๊ฐ์ ์ธ ์ ๋ ฌ์ด ํ์ ์๋ค.
- nums1์ ๊ฒฝ์ฐ ๋น ๋ฐ์ดํฐ๋ค์ 0์ผ๋ก ๋ค ์ฑ์์ ธ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ด์ฉํด์ nums[idx] = element
์ฐ์ฐ ๋ง์ ํตํด TC๋ฅผ ์ค์ผ ์ ์์ง ์์๊น?
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
# nums2 is empty
if n == 0:
return
# Best Aprroach
# use 2 pointer
ptr1, ptr2 = m-1, n-1
end = m+n-1
while ptr2>=0:
if ptr1>=0 and nums1[ptr1] > nums2[ptr2]:
nums1[end] = nums1[ptr1]
ptr1 -= 1
else:
nums1[end] = nums2[ptr2]
ptr2 -= 1
end -= 1
๋ณด๋ค์ํผ ๋์์๋ถํฐ ํฐ ๊ฐ์ ๋ฃ์ด์ฃผ๊ณ ์๋ค. ๋ค์์๋ถํฐ ๋น๊ตํ๋ฉด์ ์ ์ผ ํฐ ๊ฐ์ end
์ธ๋ฑ์ค์ ๋ฃ์ด์ฃผ๊ณ ์๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ๋๋ฉด ํฐ ๊ฐ๋ถํฐ ๋ค์์ ์ ๋ ฌ์ด ๋๋ฉด์ ์ํ๋ ํ๋ฒ๋ง ํ๋ฉด ๋๋ฏ๋ก Time complexity : O(m+n)
์ ๋ง์กฑํ ์ ์๋ค.
๊ฐ๋จํ ๋ฌธ์ ์ด๋ ์ฐธ์ ํ๋ค. ํญ์ ๊ณ ๋ฏผํ์.