ํฌ ํฌ์ธํฐ(Two Pointers)
- ์ด๋ค ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ฐ์ ๊ตฌ๊ฐ์ ๊ตฌํ ๋
O(N)
์ผ๋ก ํ ์ ์๋ค. - 2๊ฐ์ ํฌ์ธํฐ๋ฅผ ์กฐ์ํด๊ฐ๋ฉฐ ์ํ๋ ๋ต์ ์ป๋๋ค.
Python ์ฝ๋
LeetCode์ 3๋ฒ ๋ฌธ์ ๋ฅผ two-pointers๋ก ํผ ์ฝ๋์ด๋ค. l, r ๋ ๊ฐ์ ํฌ์ธํฐ ๋ชจ๋ 0๋ถํฐ ์์ํ๋ค. ๋์ ๋๋ฆฌ์ ์ธ๋ฑ์ค์ ๋ฌธ์๋ฅผ ๊ฐ์ด ์ ์ฅํ๋ค. ๋ง์ฝ ๋ฌธ์๊ฐ ๋์ ๋๋ฆฌ์ ์๋ ๊ฒฝ์ฐ l ํฌ์ธํฐ๋ฅผ ์ค๋ณต๋ ๋ฌธ์ ๋ค์ ์ธ๋ฑ์ค์ ํ์ฌ ์์น ์ค ์ธ๋ฑ์ค๊ฐ ํฐ ๊ณณ์ผ๋ก ์ฎ๊ธด๋ค. ์ด๋ ํญ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๋ ๊ฒ์ ๋ณด์ฅํ๊ธฐ ์ํจ์ด๋ค. ๋ฌธ์๋ฅผ ํ์ธ ํ ๋๋ง๋ค ํ์ฌ ๊ธธ์ด์ longest ๊ฐ์ ๊ณ์ํด์ ๋น๊ตํ๋ฉฐ ์ต๋ ๊ธธ์ด๋ฅผ ์ฐพ๋๋ค. r ํฌ์ธํฐ๋ ์ผ์ ํ๊ฒ 1์ฉ ์ฆ๊ฐํ๋ฉฐ, l ํฌ์ธํฐ๋ ์ค๋ณต๋ ๊ฐ์ด ๋ฐ๊ฒฌ๋ ๋ ์์ง์ธ๋ค.
def lengthOfLongestSubstring(self, s):
seen = {}
l, r = 0, 0
longest = 1
while r < len(s):
if s[r] in seen:
l = max(l, seen[r] + 1)
longest = max(longest, r - l + 1)
seen[s[r]] = r
r += 1
return longest
๊ทธ๋ฆฌ๊ณ LeetCode์ 11๋ฒ๋ฌธ์ ๋ ํฌํฌ์ธํฐ ๋ฌธ์ ๋ค. ๊ทธ๋ํ์ ๋งจ์ผ์ชฝ๊ณผ ๋งจ์ค๋ฅธ์ชฝ์ left, right ํฌ์ธํฐ๋ก ๋๋ค. left์ right ์ค์ ์งง์ ํฌ์ธํฐ๋ฅผ ํ์นธ์ฉ ์ฎ๊ธฐ๋ฉด์ ์ง์ฌ๊ฐํ ๋ฉด์ ์ ์ต๋๊ฐ์ ๊ตฌํ๋ค. left, right ํฌ์ธํฐ๊ฐ ๋ง๋ฌ์ ๋ ์ข ๋ฃํ๋ค. Brute-force๋ฅผ ์ฐ๋ฉด ์๊ฐ์ด๊ณผ๊ฐ ๋จ๊ธฐ ๋๋ฌธ์ ํฌํฌ์ธํฐ๋ฅผ ์ฌ์ฉํด์ O(N)์ผ๋ก ํด๊ฒฐํด์ผ ํ๋ค.
def maxArea(self, height):
l, r, maxArea = 0, len(height)-1, 0
while l < r:
if height[l] < height[r]:
maxArea = max(maxArea, height[l]*(r-l))
l += 1
else:
maxArea = max(maxArea, height[r]*(r-l))
r -= 1
return maxArea
์ฌ๋ผ์ด๋ฉ ์๋์ฐ(Sliding Window)
- ํฌ ํฌ์ธํฐ์ ๋น์ทํ ์ ํ์ด๋ค.
- ํฌ ํฌ์ธํฐ์๋ ๋ฌ๋ฆฌ ํญ์ ๊ตฌ๊ฐ์ ๊ธธ์ด๊ฐ ๊ฐ๋ค๋ ์ฐจ์ด์ ์ด ์๋ค.
- ๋ฐ๋ผ์ ํฌ ํฌ์ธํฐ๋ ๊ตฌ๊ฐ ์์ชฝ ๋์ด ๋๋ ํฌ์ธํฐ๊ฐ 2๊ฐ ํ์ํ ๋ฐ๋ฉด, ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ ๊ตฌ๊ฐ์ ๊ธธ์ด๊ฐ ๊ณ ์ ๋์ด ์์ผ๋ฏ๋ก ํฌ์ธํฐ๊ฐ 2๊ฐ์ผ ํ์๋ ์๋ค.