[dolphinflow86] WEEK 09 Solutions - #2826
Conversation
|
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
linked-list-cycle/dolphinflow86.py
# N is the number of nodes in the linked list.
# TC: O(N) - visits each node at most twice
# SC: O(1) - uses only two pointers without extra space
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
from typing import Optional
class Solution:
def hasCycle(self, head: Optional[ListNode]) -> bool:
if not head or not head.next:
return False
slow = head
fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
return True
return False- ํจํด: Two Pointers, Fast & Slow Pointers
- ์ค๋ช : ํค๋ ํฌ์ธํฐ์ ์ฌ๋ก์ฐ/ํจ์คํธ ํฌ์ธํฐ๋ฅผ ์ด์ฉํด ์ํ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๋ํ์ ๋ฐฉ๋ฒ์ผ๋ก, ํ ๋ ธ๋์ฉ ๋๋ฆฌ๊ฒ, ๋ ๋ ธ๋์ฉ ๋น ๋ฅด๊ฒ ์งํํ๋ฉฐ ๋ง๋๋ ์ง์ ์ ํ์ธํฉ๋๋ค. ์ถ๊ฐ ๊ณต๊ฐ ์์ด O(N) ์๊ฐ๊ณผ O(1) ๊ณต๊ฐ์ผ๋ก ํด๊ฒฐํฉ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n) |
| Space | O(1) |
ํผ๋๋ฐฑ: ๋ ํฌ์ธํฐ๋ฅผ ์ด์ฉํ ์ํ๋ก ์ถ๊ฐ ์ ์ฅ ๊ณต๊ฐ ์์ด ์ฌ์ดํด ์ฌ๋ถ๋ฅผ ํ๋ณํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
๐ dolphinflow86 ๋์ ํ์ต ํํฉ์ด๋ฒ ์ฃผ ์ ์ถ ๋ฌธ์
๋์ ํ์ต ์์ฝ
๋ฌธ์ ํ์ด ํํฉ
๐ค ์ด ๋๊ธ์ GitHub App์ ํตํด ์๋์ผ๋ก ์์ฑ๋์์ต๋๋ค. ๐ข API ์ฌ์ฉ๋ (gpt-5-nano)
|
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
maximum-product-subarray/dolphinflow86.py
# N is the length of array nums.
# TC: O(N) - single pass maintaining maximum and minimum product
# SC: O(1) - uses constant extra variables
from typing import List
class Solution:
def maxProduct(self, nums: List[int]) -> int:
if not nums:
return 0
res = nums[0]
cur_max = nums[0]
cur_min = nums[0]
for i in range(1, len(nums)):
num = nums[i]
if num < 0:
tmp = cur_max
cur_max = cur_min
cur_min = tmp
cur_max = max(num, cur_max * num)
cur_min = min(num, cur_min * num)
res = max(res, cur_max)
return res- ํจํด: Two Pointers, Dynamic Programming, Bit Manipulation
- ์ค๋ช : ์ฐ์ ๋ถ๋ถ๋ฐฐ์ด์ ๊ณฑ์ ์ต๋๊ฐ์ ์ฐพ๊ธฐ ์ํด ํ์ฌ ์์น์์ ์์/์์ ์ ํ ์ ๋ถํธ๋ฅผ ๋ฐ๊ฟ ๊ฐ์ฅ ํฐ/์์ ๊ณฑ์ ์ ์งํ๋ ๋ฐฉ์์ผ๋ก ํ ๋ฒ์ ์ํ๋ก ํด๊ฒฐํ๋ DP ์ฑ๊ฒฉ์ ํ์ด์ด๋ฉฐ, ๋ถํธ ๋ณํ์ ๋ฐ๋ผ cur_max์ cur_min์ ํธ๋ํนํ๋ ์์ด๋์ด๊ฐ ํต์ฌ์ด๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n) |
| Space | O(1) |
ํผ๋๋ฐฑ: ๋ถํธ๊ฐ ๋ค์งํ๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด cur_max์ cur_min์ ๊ต์ฐจ๋ก ๊ด๋ฆฌํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
minimum-window-substring/dolphinflow86.py
# S and T are the lengths of strings s and t respectively.
# TC: O(S + T) - expanding and contracting sliding window with frequency counts
# SC: O(S + T) - hash tables store frequency counts of unique characters
from collections import Counter
class Solution:
def minWindow(self, s: str, t: str) -> str:
if not s or not t:
return ""
target_counts = Counter(t)
window_counts = {}
have = 0
need = len(target_counts)
res = [-1, -1]
res_len = float("inf")
left = 0
for right in range(len(s)):
char = s[right]
window_counts[char] = window_counts.get(char, 0) + 1
if char in target_counts and window_counts[char] == target_counts[char]:
have += 1
while have == need:
if (right - left + 1) < res_len:
res = [left, right]
res_len = right - left + 1
left_char = s[left]
window_counts[left_char] -= 1
if left_char in target_counts and window_counts[left_char] < target_counts[left_char]:
have -= 1
left += 1
l, r = res
return s[l : r + 1] if res_len != float("inf") else ""- ํจํด: Sliding Window, Hash Map / Hash Set
- ์ค๋ช : ๋ฌธ์์ด s์ ๋ถ๋ถ์ฐฝ์ ์ข์ฐ๋ก ํ์ฅ/์ถ์ํ๋ฉด์ ํ์ํ ๋ฌธ์ ๋น๋์๋ฅผ ์ถ์ ํ๋ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ํจํด๊ณผ, ๋ฌธ์ ๋น๋์๋ฅผ ์ ์ฅํ๋ ํด์ ๋งต ์ฌ์ฉ์ผ๋ก ํจํด์ ํด๋นํฉ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O( |
| Space | O( |
ํผ๋๋ฐฑ: ํ๊ฒ ๋ฌธ์ ๋น๋์ ํ์ฌ ์๋์ฐ์ ๋น๋๋ฅผ ์ถ์ ํ๊ณ ํ์ํ ๋ฌธ์ ์๋ฅผ ๊ด๋ฆฌํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
linked-list-cycle/dolphinflow86.py
# N is the number of nodes in the linked list.
# TC: O(N) - visits each node at most twice
# SC: O(1) - uses only two pointers without extra space
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def hasCycle(self, head) -> bool:
if not head or not head.next:
return False
slow = head
fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
return True
return False- ํจํด: Two Pointers, Fast & Slow Pointers
- ์ค๋ช : ํด๋น ์ฝ๋๋ ๋ ํฌ์ธํฐ(slow์ fast)๋ฅผ ์ด์ฉํด ์ํ ์ฌ๋ถ๋ฅผ ํ๋ณํ๋ Fast & Slow Pointers ๊ธฐ๋ฒ์ผ๋ก ๊ตฌํ๋์๊ณ , ๊ฐ์ ๋ ธ๋๋ฅผ ๋ง๋๋ฉด ์ฌ์ดํด์ด ์กด์ฌํ๋ค๋ ์๋ฆฌ๋ก ๋์ํฉ๋๋ค. ์๊ฐ ๋ณต์ก๋๋ O(N), ๊ณต๊ฐ ๋ณต์ก๋๋ O(1)์ ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n) |
| Space | O(1) |
ํผ๋๋ฐฑ: ํด๋น ๊ตฌํ์ Floyd์ ์ฌ์ดํด ํ์ง ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ํ ๋ฒ์ ๋ฐฐ์ด ์ํ๋ฅผ ํตํด ์ฌ์ดํด ์ฌ๋ถ๋ฅผ ํ๋จํฉ๋๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
maximum-product-subarray/dolphinflow86.py
# N is the length of array nums.
# TC: O(N) - single pass maintaining maximum and minimum product
# SC: O(1) - uses constant extra variables
class Solution:
def maxProduct(self, nums) -> int:
if not nums:
return 0
res = nums[0]
cur_max = nums[0]
cur_min = nums[0]
for i in range(1, len(nums)):
num = nums[i]
if num < 0:
tmp = cur_max
cur_max = cur_min
cur_min = tmp
cur_max = max(num, cur_max * num)
cur_min = min(num, cur_min * num)
res = max(res, cur_max)
return res- ํจํด: Two Pointers, Dynamic Programming, Greedy, Bit Manipulation, Hash Map / Hash Set, Divide and Conquer, Monotonic Stack, Binary Search, BFS, DFS, Backtracking, Union Find, Trie, Heap / Priority Queue
- ์ค๋ช : ์ต๋ ๋ถ๋ถ๋ฐฐ์ด ๊ณฑ์ ์ต๋๊ฐ์ ๊ตฌํ๊ธฐ ์ํด ํ์ฌ ์์น์์์ ์ต๋/์ต์ ๊ณฑ์ ํ ๋ฒ์ ์ํ๋ก ๊ฐฑ์ ํ๋ ๋ฐฉ์์ผ๋ก, ์์ ์ฒ๋ฆฌ ์ ๋ถํธ๋ฅผ ๋ฐ๊ฟ ๋ ๊ฐ์ ๊ต์ฐจ ๋น๊ตํ๋ ํจํด์ด ํต์ฌ์ด๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n) |
| Space | O(1) |
ํผ๋๋ฐฑ: ์ฐ์ ๊ตฌ๊ฐ์ ์ต๋ ๊ณฑ์ ๊ฐฑ์ ํ๋ ํ์ค ํด๋ฒ์ผ๋ก, ๋ถํธ ๋ฐ์ ์ ์ต์๊ฐ์ด ์ต๋๊ฐ์ด ๋๋ค๋ฅผ ์ด์ฉํ๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
minimum-window-substring/dolphinflow86.py
# S and T are the lengths of strings s and t respectively.
# TC: O(S + T) - expanding and contracting sliding window with frequency counts
# SC: O(S + T) - hash tables store frequency counts of unique characters
class Solution:
def minWindow(self, s: str, t: str) -> str:
if not s or not t:
return ""
target_counts = {}
for char in t:
target_counts[char] = target_counts.get(char, 0) + 1
window_counts = {}
have = 0
need = len(target_counts)
res = [-1, -1]
res_len = float("inf")
left = 0
for right in range(len(s)):
char = s[right]
window_counts[char] = window_counts.get(char, 0) + 1
if char in target_counts and window_counts[char] == target_counts[char]:
have += 1
while have == need:
if (right - left + 1) < res_len:
res = [left, right]
res_len = right - left + 1
left_char = s[left]
window_counts[left_char] -= 1
if (
left_char in target_counts
and window_counts[left_char] < target_counts[left_char]
):
have -= 1
left += 1
l, r = res
return s[l : r + 1] if res_len != float("inf") else ""- ํจํด: Sliding Window, Hash Map / Hash Set
- ์ค๋ช : ๋ฌธ์์ด s์์ ๋ถ๋ถ ๋ฌธ์์ด ์ฐฝ์ ์ข์ฐ๋ก ํ์ฅ/์ถ์ํ๋ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธฐ๋ฒ๊ณผ, ๋ฌธ์ ๋ฑ์ฅ ํ์๋ฅผ ์ธ๋ ํด์ ๋งต์ ํจ๊ป ์ฌ์ฉํ์ฌ ํ์ํ ๋ฌธ์ ์งํฉ๊ณผ ํ์ฌ ์ฐฝ์ ์ํ๋ฅผ ์ถ์ ํฉ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(n + m) |
| Space | O(K) |
ํผ๋๋ฐฑ: ์ฌ๋ผ์ด๋ฉ ์๋์ฐ์ ํด์๋งต์ ํ์ฉํด ํ์ํ ๋ฌธ์ ์๋ฅผ ๋ง์กฑํ๋ ์ต์ ์ฐฝ์ ์ฐพ๋๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
pacific-atlantic-water-flow/dolphinflow86.py
# M is the number of rows, and N is the number of columns.
# TC: O(M * N) - visits each cell constant number of times via DFS
# SC: O(M * N) - stores visited sets and recursion stack for both oceans
class Solution:
def pacificAtlantic(self, heights):
if not heights or not heights[0]:
return []
rows, cols = len(heights), len(heights[0])
pacific = set()
atlantic = set()
def dfs(r, c, visited, prev_height):
if r < 0 or r >= rows or c < 0 or c >= cols:
return
if (r, c) in visited or heights[r][c] < prev_height:
return
visited.add((r, c))
dfs(r + 1, c, visited, heights[r][c])
dfs(r - 1, c, visited, heights[r][c])
dfs(r, c + 1, visited, heights[r][c])
dfs(r, c - 1, visited, heights[r][c])
for c in range(cols):
dfs(0, c, pacific, heights[0][c])
dfs(rows - 1, c, atlantic, heights[rows - 1][c])
for r in range(rows):
dfs(r, 0, pacific, heights[r][0])
dfs(r, cols - 1, atlantic, heights[r][cols - 1])
return [[r, c] for r, c in pacific & atlantic]- ํจํด: DFS, Backtracking, Graph Traversal
- ์ค๋ช : ์ฝ๋๋ ๊น์ด ์ฐ์ ํ์(DFS)๋ก ๋ ๋ฐ๋ค์ ๋๋ฌ ๊ฐ๋ฅํ ์ ์ ํ์ํฉ๋๋ค. ๋ฐฉ๋ฌธ ์งํฉ์ ์ด์ฉํด ์ค๋ณต ํ์์ ํผํ๊ณ , ์ธ์ ์ ๋ก์ ์ฌ๊ท ํธ์ถ์ ํตํด ์ฐ๊ฒฐ์ฑ์ ํ์ธํฉ๋๋ค. ๋ํ ๋ ์งํฉ์ ๊ต์งํฉ์ผ๋ก ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋์ถํฉ๋๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(mn) |
| Space | O(mn) |
ํผ๋๋ฐฑ: DFS๋ก ๊ฐ ์ธํฌ์ ๋ํด ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ถ์ ํ๊ณ , ๋ ํด์์ผ๋ก๋ถํฐ์ ๋๋ฌ ๊ฐ๋ฅ ๊ฒฝ๋ก๋ฅผ ํ์ํฉ๋๋ค. ๋ชจ๋ ์ ์ ๋ํด ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธํ๋ฏ๋ก ์๊ฐ์ ํ๋ ฌ์ ํฌ๊ธฐ์ ๋น๋กํฉ๋๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
There was a problem hiding this comment.
๐ท๏ธ ์๊ณ ๋ฆฌ์ฆ ํจํด ๋ถ์
sum-of-two-integers/dolphinflow86.py
# TC: O(1) - loops at most 32 times for 32-bit integer addition
# SC: O(1) - uses constant extra space
class Solution:
def getSum(self, a: int, b: int) -> int:
mask = 0xFFFFFFFF
max_int = 0x7FFFFFFF
while b != 0:
carry = (a & b) << 1
a = (a ^ b) & mask
b = carry & mask
return a if a <= max_int else ~(a ^ mask)- ํจํด: Bit Manipulation
- ์ค๋ช : ๋ ์ ์์ ํฉ์ ๋นํธ ์ฐ์ฐ์ผ๋ก ์ฒ๋ฆฌํ๋ฉฐ, XOR๋ก ํฉ์, AND์ ์ผ์ํํธ๋ก ์บ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์ด ์๋ค. ์์ ์๊ฐ/๊ณต๊ฐ์ ํน์ฑ๊ณผ ๋นํธ ์ฐ์ฐ ๊ธฐ๋ฐ์ ์๊ณ ๋ฆฌ์ฆ ํจํด์ด ํต์ฌ์ด๋ค.
๐ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋ ๋ถ์
| ๋ณต์ก๋ | |
|---|---|
| Time | O(1) |
| Space | O(1) |
ํผ๋๋ฐฑ: ๋นํธ ์ฐ์ฐ๊ณผ ๋ง์คํฌ๋ฅผ ์ด์ฉํด ์ํํธ ๋ฐ ์บ๋ฆฌ ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ํํฉ๋๋ค. ์์ ์๊ฐ์ ์๋ํ๋๋ก ์ค๊ณ๋์ด ์์ต๋๋ค.
๊ฐ์ ์ ์: ํ์ฌ ๊ตฌํ์ด ์ ์ ํด ๋ณด์ ๋๋ค.
๐ก ํ์ด์ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ฒจ๋ณด์ธ์!
๋ต์ ์ ์ถ ๋ฌธ์
์์ฑ์ ์ฒดํฌ ๋ฆฌ์คํธ
In Review๋ก ์ค์ ํด์ฃผ์ธ์.๊ฒํ ์ ์ฒดํฌ ๋ฆฌ์คํธ
Important
๋ณธ์ธ ๋ต์ ์ ์ถ ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋ถ PR ํ๋ ์ด์์ ๋ฐ๋์ ๊ฒํ ๋ฅผ ํด์ฃผ์ ์ผ ํฉ๋๋ค!