Table of contents
Open Table of contents
๋ค์ด๊ฐ๋ฉฐ
๊ฑธ๋ฆฐ ์๊ฐ: 50๋ถ (์๋ ฅ์ผ๋ก ํ์ง ๋ชปํ๊ณ , ์๋ฃจ์ ์ ์ฐพ์์ ๋ณด๊ณ ์ฐธ๊ณ ํด์ ํ์์ต๋๋ค.)
์ฒ์ ๋ฌธ์ ๋ฅผ ์ฝ๊ณ , subarray๋ฅผ ๋ชจ๋ ๊ฒฐ์ ์ง๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์๊ฐํด ๋ดค์ต๋๋ค.
๊ฒฐ์ ์ง๋ ๊ฒฝ์ฐ์ ์๋ ๊ฐ๋จํฉ๋๋ค.
subarray์ ์์ index s
์ ๋ index e
์ ์์์ (s, e)๋ฅผ ๊ตฌํ๋ฉด ๋ฉ๋๋ค.
์ฆ ์
๋๋ค.
์ด ๋ฌธ์ ์์๋์, ์ฃผ์ด์ง array์ ๊ธธ์ด์ ์ต๋๊ฐ ์ด์ด์, ์ด๊ฒ ๋๊ณ , ์๊ฐ ์ด๊ณผ๊ฐ ๋์ค๊ฒ ๋ฉ๋๋ค.
์ ๊ทผ
๊ทธ๋์ ์ ๋ ๋ฌธ์ ์ ๋ชฉํ๋ฅผ ๋ค์ ๋ช ํํ ํด๋ดค์ต๋๋ค.
๋ชฉํ:
nums
์ subarray๋ค ์ค์์, subarray๋ด |์ต๋ ์์์ ๊ฐ - ์ต์ ์์์ ๊ฐ| <=limit
์ ๋ง์กฑํ๋ subarray๋ฅผ ๊ตฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ subarray๋ค ์ค์์ |subarray| (์ฆ, len(subarray))๊ฐ ๊ฐ์ฅ ํฐ ๊ฐ์ ๊ตฌํ์ฌ๋ผ.
์ ์ผ๋ก ๊ฐ์ ํ๋ฉด ์ด๋จ๊น๋ผ๋ ์๊ฐ์ด ๋ค์๊ณ , ์ด ๋ฌธ์ ์์๋ ํฌํฌ์ธํฐ๋ฅผ ์ฐ๋ฉด ๊ฐ์ ์ ํ ์ ์๊ฒ ๋ค๋ผ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
๊ทธ๋์ l
, r
์ ๋๊ณ ํฌํฌ์ธํฐ ํ
ํฌ๋์ ์จ์, l, r์ ์๋ฆฌ์กฐ๋ฆฌ ์ฎ๊ฒจ ๋ค๋๊ฒ ํ์ต๋๋ค.
์ฒ์ ๋ ํฌ์ธํฐ์ ์ด๊ธฐ๊ฐ์ 0
์ผ๋ก ๋๊ณ , |max - min|๊ฐ์ด limit๋ณด๋ค ์์ผ๋ฉด, r += 1์ ํด์ฃผ๊ณ , |max - min|์ด l += 1์ ํด์ฃผ์ด์, ๊ธฐ์กด์ O(N^2)์ O(N)์ผ๋ก ๊ฐ์ ํ๊ฒ ํ์ต๋๋ค.
๊ทธ๋ฐ๋ฐโฆ
max - min|๊ฐ์ด limit๋ณด๋ค ์์ผ๋ฉด, r += 1์ ํด์ฃผ๊ณ , |max - min|์ด l += 1์ ํด์ฃผ์ด์
๋ฅผ ํ ์ ์๋ ๊ทผ๊ฑฐ๋ ๋ญ๋๋ผ๊ณ ๋ฌผ์ผ์ ๋ค๋ฉด์โฆ ์ธ ๊ฐ์ง์ ๊ฐ๋ ฅํ ๊ด์ฐฐ์ ๋ฐํ์ผ๋ก ๋์ถํด๋์ต๋๋ค.
l
์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผmax(subarray) - min(subarray) > limit
์ด ๋๋ ์ต์ด์r
์ง์ ์ ์ฆ๊ฐํ๋ค.- ๊ฐ
l
์๋ํดmax(subarray) - min(subarray) > limit
์ด ๋๋ ์ต์ด์r
์ง์ ์ ์ฐพ์ ์ดํ์๋ ๋์ด์nums[r + 1]
,nums[r + 2]
โฆ๋ฅผ ํ์ํ ํ์๊ฐ ์์ต๋๋ค. ์๋๋ฉด ์์์ ์๋ฌด ์ซ์๋ฅผ subarray์ ๋ฐ์๋ค์ฌ์ค๋ค max(subarray) - min(subarray)๋ ์ปค์ง๊ธฐ๋ง ํฉ๋๋ค. max(subarray) - min(subarray) <= limit
๊ฐ ๋๋ ์ต์ด์r
์ง์ ์ ํ์ํด๋ธ ๋ค์์๋ r์ ๊ณ์ ์ฆ๊ฐํด๋ ๋ฉ๋๋ค. ์๋๋ฉด 2๋ฒ์์ ๋งํ ๋๋ก, ์์์ ์๋ฌด ์ซ์๋ฅผ subarray์ ๋ฐ์๋ค์ฌ ์ฃผ๋ฉดmax(subarray) - min(subarray)
๋ ์ปค์ง๊ธฐ๋ง ํ ์ ์์ง, ์ ๋ ์์์ง ์ ์์ต๋๋ค.
๊ตฌํ (TLE ๋ฐ์)
class Solution:
def longestSubarray(self, nums: List[int], limit: int) -> int:
def OOB(cur_l, cur_r):
if cur_l < 0 or cur_l >= n:
return True
if cur_r < 0 or cur_r >= n:
return True
return False
n = len(nums)
# print(f"n: {n}")
l = r = 0
max_num = min_num = nums[0]
li = [nums[0]]
ans = 0
while not OOB(l, r) and l <= r:
max_abs = max_num - min_num
# print(f"l: {l}, r: {r}, max_abs: {max_abs}")
if max_abs <= limit:
ans = max(ans, r - l + 1)
r += 1
# find a new num
if OOB(l, r):
continue
li.append(nums[r])
max_num = max(max_num, nums[r])
min_num = min(min_num, nums[r])
else:
l += 1
del li[0]
max_num = max(li)
min_num = min(li)
return ans
์ ์ฝ๋๋ ์์ฃผ ํฐ input์ ๋ํด TLE๋ฅผ ๋ฐ์์ต๋๋ค.
์ฌ์ค ๊ตฌํํ๋ฉด์๋
else:
l += 1
del li[0]
max_num = max(li)
min_num = min(li)
์ด ๋ถ๋ถ์์ ์๊ฐ ๋ณต์ก๋ ์์์ ํฐ ๋ฌธ์ ๊ฐ ์๊ฒ ๊ตฌ๋๋ฅผ ์ง๊ฐํ์ต๋๋ค. (๊ฒฐ๊ตญ O(N^2)์ด ๋๋ค์โฆ)
๊ทธ๋ฌ๋ฉด, ํฌ ํฌ์ธํฐ์์ ์ผ์ชฝ ํฌ์ธํฐ๋ฅผ ์ฆ๊ฐํ๊ณ ๋์, O(1)๋ง์ ํฌ ํฌ์ธํฐ ๊ตฌ๊ฐ ๋ด์์ max์ min์ ๋ฝ๋ ๋ฒ์ด ๋ญ๊ฐ ์์์ง ๊ณ ๋ฏผ์ ํ๊ณ , ๊ฒฐ๊ตญ ์ธํฐ๋ท์์ approach๋ฅผ ์ฐพ์ ๋ดค์ต๋๋ค.
๊ตฌํ (Monotonic Queue ํ ํฌ๋)
from collections import deque
class Solution:
def longestSubarray(self, nums: List[int], limit: int) -> int:
def OOB(cur_l, cur_r):
if cur_l < 0 or cur_l >= n:
return True
if cur_r < 0 or cur_r >= n:
return True
return False
n = len(nums)
# print(f"n: {n}")
l = r = 0
dec_dq = deque()
inc_dq = deque()
dec_dq.append(0)
inc_dq.append(0)
ans = 0
while not OOB(l, r) and l <= r:
max_abs = nums[dec_dq[0]] - nums[inc_dq[0]]
# print(f"l: {l}, r: {r}, max_abs: {max_abs}")
if max_abs <= limit:
ans = max(ans, r - l + 1)
r += 1
# find a new num
if OOB(l, r):
continue
while dec_dq and nums[dec_dq[-1]] < nums[r]:
dec_dq.pop()
while inc_dq and nums[inc_dq[-1]] > nums[r]:
inc_dq.pop()
dec_dq.append(r)
inc_dq.append(r)
else:
l += 1
if dec_dq[0] < l:
dec_dq.popleft()
if inc_dq[0] < l:
inc_dq.popleft()
return ans
ํน์ ๊ตฌ๊ฐ์์ ์์ ์๊ฐ๋ง์ max์ min์ ๋ฝ์๋ด๋ ํ
ํฌ๋์ผ๋ก Monotonic Queue๋ผ๋ ํ
ํฌ๋์ ์ฐ๋ฉด ๋๋ค๋ ๊ฑธ ์๊ฒ ๋์ต๋๋ค.
๊ฐ๋จํ ์ค๋ช
ํ์๋ฉด ๋จ์กฐ๊ฐ์ ํ์ ๋จ์กฐ์ฆ๊ฐ ํ๋ฅผ ๋ก๋๋ค.
- ๋จ์กฐ๊ฐ์ํ๋ ๋จ์กฐ๊ฐ์๊ฐ ํญ์ ์ด๋ค์ง๊ฒ ํ์ ์์๋ฅผ ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค. ๋ง์ฝ ๋จ์กฐ๊ฐ์๊ฐ ๊นจ์ง ๊ฑฐ ๊ฐ๋ค? ๊ทธ๋ฌ๋ฉด ์ด๋ฏธ ๋ค์ด๊ฐ ์์๋ค์ ๋ชจ์กฐ๋ฆฌ popleftํด์ค๋๋ค.
- ๋จ์กฐ์ฆ๊ฐํ๋ ๋จ์กฐ์ฆ๊ฐ๊ฐ ํญ์ ์ด๋ค์ง๊ฒ ํ์ ์์๋ฅผ ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค. ๋ง์ฝ ๋จ์กฐ์ฆ๊ฐ๊ฐ ๊นจ์ง ๊ฑฐ ๊ฐ๋ค? ๊ทธ๋ฌ๋ฉด ์ด๋ฏธ ๋ค์ด๊ฐ ์์๋ค์ ๋ชจ์กฐ๋ฆฌ popleftํด์ค๋๋ค.
Monotonic Queue๋ Queue์ Top์ peekํด์ ๋จ์กฐ์ฆ๊ฐ์ด ๊นจ์ง ๊ฑฐ ๊ฐ์์ง๋ฅผ ํ์
ํด์ผ ๋๊ธฐ ๋๋ฌธ์, Deque ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด์ ๊ตฌํํด์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ค์ํ ์ !! Queue์๋ Index๋ฅผ ๋ฃ์ด์ผ ๋ฉ๋๋ค.
๋จ์กฐ๊ฐ์ํ์ ๊ฐ์ฅ ์์ ๋ณด๋ฉด ์ต๋๊ฐ์ด ๋์ค๊ณ , ๋จ์กฐ์ฆ๊ฐํ์ ๊ฐ์ฅ ์์ ๋ณด๋ฉด ์ต์๊ฐ์ด ๋์ต๋๋ค!