0300. Longest Increasing Subsequence / 0053. Maximum Subarray
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
length = len(nums)
dp = [1]*length
for x in range(1,length):
for y in range(0,x):
if nums[y] < nums[x]:
dp[x] = max(dp[x],dp[y]+1)
return max(dp)
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
ans,curmax=-10001,0
for i in range(len(nums)):
curmax=max(curmax+nums[i],nums[i])
ans=max(ans,curmax)
return ans
๐ง๐ป๐ป 300) ์ ํ์ LIS ์ ํ ๋ฌธ์ . ์ ์ฝ๋๋ O(n^2)์ผ๋ก ํด๊ฒฐํ ์๊ณ ๋ฆฌ์ฆ์ด๋, ์ด๋ถํ์์ ํ์ฉํ O(nlogn) ์๊ณ ๋ฆฌ์ฆ ํ์ด๋ ๊ฐ๋ฅํ๋ค.
๐ง๐ป๐ป 053) subarray์ ์ฐ์๋ ๋ถ๋ถํฉ์ด ๊ฐ์ฅ ํด ๋์ sum ๊ฐ์ ์ถ๋ ฅํ๋ ๋ฌธ์ . dp ๋๋ divide & conquer ๊ธฐ๋ฒ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ(์ ํ์ด๋ dp๋ก curmax๋ฅผ O(n)์ผ๋ก ๋๋ฉฐ ๊ณ์ ์ ๋ฐ์ดํธ)
0152. Maximum Product Subarray / 0198. House Robber
class Solution:
def maxProduct(self, nums: List[int]) -> int:
dp=(nums[0],nums[0])
ans=nums[0]
for i in range(1,len(nums)):
dp=(max(dp[0]*nums[i],dp[1]*nums[i],nums[i]),min(dp[0]*nums[i],dp[1]*nums[i],nums[i]))
ans = max(ans,max(dp))
return ans
class Solution:
def rob(self, nums: List[int]) -> int:
dp=(nums[0],0)
for x in range(1,len(nums)):
dp=(dp[1]+nums[x],max(dp))
return max(dp)
๐ง๐ป๐ป 152) subarray์ ํฉ์ด ์๋ subarray์ product ์ต๋๊ฐ์ ๊ตฌํ๋ ๋ฌธ์ . ๋ฐฐ์ด์ 0๊ณผ ์์๋ ๋ค์ด๊ฐ ์ ์์ผ๋ฏ๋ก, ์์์ ์์๋ฅผ ๊ณฑํ๋ฉด ๋ค์ ์์๋ก ๋ฐ๋์ด ํฐ ๊ฐ์ผ๋ก ๋๊ธฐ ๋๋ฌธ์ dp-table์ tuple๊ฐ์ ํ์ฌ์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ ๋ ๊ฐ ๋ชจ๋ update ํด์ฃผ์ด์ผ ํ๋ค. ์๊ธฐ ์์ / ์๊ธฐ ์์ ๊ณผ ์ ์์์ ์ต๋๊ฐ๊ณผ์ ๊ณฑ / ์๊ธฐ ์์ ๊ณผ ์ ์์์ ์ต์๊ฐ๊ณผ์ ๊ณฑ ์ด๋ ๊ฒ 3๊ฐ ์ค ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ผ๋ก update ํ์
๐ง๐ป๐ป 198) ์ฐ์ํด์ ์ง์ ํธ ์ ์์ผ๋ฏ๋ก ๋์ด์ ์ง์ ํธ ๊ฒฝ์ฐ ๊ฐ์ ธ๊ฐ ์ ์๋ ๋์ ์ต๋๊ฐ์ ๊ตฌํด์ผ ํ๋ค.
: ํด๋น ์์๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ๋, ์์ dp ์์์์ ํฌํจํ์ง ์์ ๊ฒฝ์ฐ + ํด๋น ์์ / ํด๋น ์์๋ฅผ ํฌํจํ์ง ์๋ ๊ฒฝ์ฐ๋, ํด๋น ์์ ์์ด, ์์ dp์ ์ต๋๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ ํด์ฃผ๋ฉด ๋๋ค.
0238. Product of Array Except Self / 0098. Validate Binary Search Tree
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
ans=[]
pre,after = [],[]
pre_n,after_n=1,1
for x in range(len(nums)):
pre_n*=(nums[x])
pre.append(pre_n)
after_n*=(nums[len(nums)-1-x])
after.append(after_n)
a,b=-1,len(nums)-2
for x in range(len(nums)):
if a < 0:
ans.append(after[b])
elif b < 0:
ans.append(pre[a])
else:
ans.append(pre[a]*after[b])
a+=1
b-=1
return ans
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isValidBST(self, root: Optional[TreeNode]) -> bool:
def check(node, low=-float('inf'), high=float('inf')):
if not node:
return True
if node.val <= low or node.val >= high:
return False
return (check(node.left, low, node.val) and check(node.right, node.val, high))
return check(root)
๐ง๐ป๐ป 238) ํ์ฌ ์์์ index๊ฐ x๋ผ๋ฉด (index 0 ~ (x-1)๊น์ง์ ๊ณฑ) x (index (x+1)๋ถํฐ ๋๊น์ง์ ๊ณฑ)์ ๊ฐ ์์๋ง๋ค ์ ๋ฐ์ดํธํด์ฃผ๋ฉด ๋๋ค.
๐ง๐ป๐ป 098) ์ฃผ์ด์ง Tree๊ฐ Binary Search Tree๋ฅผ ๋ง์กฑํ๋ฉด์ valid BST์ธ์ง๊น์ง ๋ ๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑ์ํค๋ ์ง ํ์ธํ๋ ๋ฌธ์ . valid BST๋, head node๊ฐ ์๊ณ left ๋๋ right child๊ฐ ์๋ค๋ฉด, ์ ์ฒด tree์ ๋ชจ๋ subtree๊ฐ left.val < head.val < right.val์ ๋ง์กฑ์ํค๋ tree์ด๋ค.
: ์ฌ๊ธฐ์ ์ฃผ์ํ ๊ฑด, ์ ์ฒด tree์ ๋ชจ๋ subtree๊ฐ left.val < head.val < right.val์ ๋ง์กฑ์์ผ์ผ ํ๋ค๋ ์ . ์๋ ์์๋ฅผ ํ์ธํ์
: ์ด๋ก์์ ๊ฐ๋ฆฌํค๋ sub-tree๋ left.val < root.val < right.val ์์ฑ์ ๋ง์กฑํ๋ tree์ด๋ค. ํ์ง๋ง, ์ด๋ณด๋ค ์ค์ผ์ผ์ด ๋ ํฐ ํ๋์ ์์ญ์ subtree๋ฅผ ๋ณด์์ ๋ root.val 33๊ธฐ์ค 4๋ฒ ๋ ธ๋ val์ 0๋ฒ ๋ ธ๋ val ๋ณด๋ค ํฌ๊ณ , 5๋ฒ ๋ ธ๋ val์ 0๋ฒ ๋ ธ๋ val ๋ณด๋ค ์์ผ๋ฏ๋ก ๋ง์กฑํ์ง ์๋๋ค. ๋ฐ๋ผ์, ๋ชจ๋ subtree์ ๋ํด left.val < root.val < right.val ์์ฑ์ ๋ง์กฑํด์ผ ํ๋ค.
: recursion ํ์ฉ์ ํจ์์ parameter ์ธ ์ข ๋ฅ๋ฅผ head node, ํด๋น head node๋ฅผ head๋ก ๊ฐ๊ณ ์๋ subtree์์ head node ๊ฐ๋ฅํ ๋ฒ์ ์ต์๊ฐ-1, ์ต๋๊ฐ+1 ์ด๋ ๊ฒ ์ค์ . recursiveํ๊ฒ ๊ฐ node๋ฅผ ๋๋ฉฐ ๊ฐ node๊ฐ ๊ฐ๋ฅํ ๋ฒ์ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ ์ฌ์ด์ ์ํ์ง ์์ผ๋ฉด ๋ฐ๋ก False ๋ฆฌํด. ๊ทธ๋ ์ง ์์ผ๋ฉด ํด๋น node์ left์ right ๊ฐ๊ฐ head node๋ก ๋๋ subtree recusiveํ๊ฒ ๋๋ ค(left์ right ๋ชจ๋ ๋ง์กฑํ๊ฒ ๋๋ฏ๋ก and ์กฐ๊ฑด ์ฐ๊ฒฐ) ๊ณ์ ํ์ธ! (์ ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ ์ฐธ๊ณ )
0150. Evaluate Reverse Polish Notation / 0102. Binary Tree Level Order Traversal
import math
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack=[]
operands=['*', '+', '-', '/']
for token in tokens:
if token not in operands:
stack.append(int(token))
else:
x,y=stack.pop(),stack.pop()
if token == '+':
stack.append(x+y)
elif token == '-':
stack.append(y-x)
elif token == '/':
stack.append(math.trunc(y/x))
else: #*
stack.append(x*y)
return stack[-1]
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
from collections import deque
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
if not root:
return None
queue = deque([root])
answer = []
while queue:
level = []
length = len(queue)
for _ in range(length):
cur = queue.popleft()
level.append(cur.val)
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
answer.append(level)
return answer
๐ง๐ป๐ป 0150) operand์ ๋ฐ๋ผ ์ต๊ทผ์ ๋ค์ด์จ ๋ ๊ฐ์ ์์๋ฅผ ์ฐ์ฐํ๋ ์ ํ์ ์ธ stack ๋ฌธ์ . ์๋ฅผ ๋ค์ด 3 4 + ๋ผ๋ฉด, ์ซ์๋ง stack์ ๋ฃ๊ณ , +์ ๊ฐ์ operand๋ฅผ ๋ง๋ฌ์ ๋ ์ต๊ทผ์ ๋ฃ์ ๋ ๊ฐ๋ฅผ ๋นผ์ operand์ ๋ฐ๋ผ ์ฐ์ฐํ ๋ค, ๋ค์ stack์ ๋ฃ๊ธฐ๋ฅผ ๋ฐ๋ณต. ์ด ๋ ๋๋์ ๋ง ์ฃผ์. ํ์ด์ฌ์ ๊ฒฝ์ฐ / ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ๋๋๊ณ , math.trunc() ํจ์(์์์ ๋ฒ๋ฆฌ๋ ํจ์) ํ์ฉํ์ฌ ์ฐ์ฐ
๐ง๐ป๐ป 0102) level order๋ก ์ฝ์ด์ level ๋ณ node์ value๋ฅผ ํ ๊ฐ์ list๋ก ๋ง๋ค๊ณ ์ ์ฒด ์ด์ค list๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ . level๋ณ๋ก node๋ฅผ ์ฝ์ผ๋ฏ๋ก BFS ํ์ฉ. for๋ฌธ ๋ด๋ถ์ print(root)๋ฅผ ๋ฃ๋๋ค๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
์ฆ root์ ๊ธธ์ด ์์ฒด๊ฐ ํ level์ node ๊ฐ์์ด๋ฏ๋ก length = len(queue)๋ก length๋งํผ popleft() ์งํํ ๋ค์, for๋ฌธ ๋ ๋๋ง๋ค level list์ node.val append. ์ต์ข ์ ์ผ๋ก level list๋ฅผ ๊ณ์ ๋ฃ์ answer 2์ฐจ์ list ์ถ๋ ฅ
0133. Clone Graph / 0200. Number of Islands
"""
# Definition for a Node.
class Node:
def __init__(self, val = 0, neighbors = None):
self.val = val
self.neighbors = neighbors if neighbors is not None else []
"""
from typing import Optional
from collections import deque
class Solution:
def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
if not node:
return
clone = Node(node.val)
clones = {node: clone}
queue = deque([node])
while queue:
node = queue.popleft()
for nei in node.neighbors:
if nei not in clones:
clones[nei] = Node(nei.val)
queue.append(nei)
clones[node].neighbors.append(clones[nei])
return clone
from collections import deque
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
def BFS(graph, start):
graph[start[0]][start[1]] = '0'
queue = deque([start])
dx, dy = [-1,1,0,0], [0,0,-1,1]
while queue:
node = queue.popleft()
for i in range(4):
nx, ny = node[0]+dx[i], node[1]+dy[i]
if 0<=nx<m and 0<=ny<n:
if graph[nx][ny] == '1':
graph[nx][ny] = '0'
queue.append((nx,ny))
m, n = len(grid), len(grid[0])
ans = 0
for x in range(m):
for y in range(n):
if grid[x][y] == '1':
ans += 1
BFS(grid,(x,y))
return ans
๐ง๐ป๐ป 0133) BFS
(1) ์์ node๋ฅผ ์ํ clone Node class๋ฅผ ์์ฑ.
(2) ๊ทธ ๋ค์ queue์ ๋ฃ๊ณ , BFS๋ก ์ฐ๊ฒฐ ๋ ธ๋ ํ์ธ. ์ฐ๊ฒฐ ๋ ธ๋ ์์ ๋๋ง๋ค ๊ธฐ์กด ๋ ธ๋์ neighbors์ update
(3) ์ฐ๊ฒฐ ๋ ธ๋๊ฐ clones์ ์๋ค๋ฉด ์ฐ๊ฒฐ ๋ ธ๋๊ฐ ๋ค์ด๊ฐ ์๋ก์ด Node class ์์ฑํ๊ณ clones dictionary์ ์์ฑํ Node class ์ฝ์ . queue์ append
(4) ์ (2) ~ (3) ๊ณผ์ queue์ ์๋ฌด ๊ฒ๋ ์์ ๋๊น์ง ๋ฐ๋ณต
(5) ์ต์ข ) 'return the copy of the given node as a reference to the cloned graph'๋ผ๊ณ ํ์์ผ๋ฏ๋ก the given node(val = 1)๋ก ์ฒ์์ ๋ง๋ clone ๋ฐ๋ก return (return clone)
๐ง๐ป๐ป 0200) ์ฐ๊ฒฐ์์์ ๊ฐ์ ์ ํ
1456. Maximum Number of Vowels in a Substring of Given Length / 0033. Search in Rotated Sorted Array
class Solution:
def maxVowels(self, s: str, k: int) -> int:
ans=0
for letter in s[:k]:
if letter in 'aeiou':
ans+=1
start=0
prev=ans
for letter in s[k:]:
if s[start] in 'aeiou':
prev-=1
if letter in 'aeiou':
prev+=1
ans=max(ans,prev)
start+=1
return ans
class Solution:
def search(self, nums: List[int], target: int) -> int:
start,end=0,len(nums)-1
while start<=end:
mid = (start+end)//2
if target == nums[mid]:
return mid
#left
if nums[start] <= nums[mid]:
if target > nums[mid] or target < nums[start]:
start = mid + 1
else:
end = mid - 1
#right
else:
if target < nums[mid] or target > nums[end]:
end = mid - 1
else:
start = mid + 1
return -1
๐ง๐ป๐ป 1456) ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๋ฌธ์ . ์ ํด์ง ๊ธธ์ด๋งํผ ์ค๋ฅธ์ชฝ ๋๊น์ง ์ฌ๋ผ์ด๋ ์งํํ๋ฉด์ ๋งจ ์๊ณผ ๋งจ ๋ค์ ๊ธ์๊ฐ vowel์ ๋ค์ด๊ฐ๋ ์ง์ ๋ฐ๋ผ -=1, +=1. max() ํจ์ ์ฌ์ฉํด์ ์ ๋ฐ์ดํธ
๐ง๐ป๐ป 0033) ์ด๋ถํ์ ์์ฉ๋ฒ์ . ์๋ ์ด๋ถํ์์ sorted ๋ ์ํ์์ ์งํํ๋ ๊ฒ์ด ๊ตญ๋ฃฐ์ด๋, rotated sorted array์์ ์ด๋ถํ์์ ์งํํ๋ค๋ ์ ์ด ์ฃผ๋ชฉํ ๋งํ ๋ถ๋ถ. ๋จ rotated sorted array๋ sorted๋ array 2๊ฐ๊ฐ ๊ฒฐํฉํ ๊ฒ์์ ์์์ผ ํ๋ค.
: mid ์์๊ฐ ์ผ์ชฝ sorted array์ ์ํ๋ ์ง, ์ค๋ฅธ์ชฝ sorted array์ ์ํ๋ ์ง์ ๋ฐ๋ผ์ ๋ค๋ฅด๊ฒ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ง๋ค์ด start, end update
0139. Word Break / 0207. Course Schedule
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
dp = [True] + [False]* len(s)
for i in range(1, len(s) + 1):
for word in wordDict:
if s[i - len(word): i] == word:
dp[i] = dp[i-len(word)]
if dp[i]: #found True only once
break
return dp[-1]
class Solution:
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
from collections import deque
indegree = [0] * (numCourses)
graph = [[] for _ in range(numCourses)]
for prerequisite in prerequisites:
x,y=prerequisite[0],prerequisite[1]
graph[y].append(x)
indegree[x]+=1
res = 0
q = deque()
for i in range(numCourses):
if indegree[i] == 0:
q.append(i)
while q:
node = q.popleft()
res += 1
for i in graph[node]:
indegree[i] -= 1
if indegree[i] == 0:
q.append(i)
return res==numCourses
๐ง๐ป๐ป 0139) 'leetcode'๋ผ๋ ๋ฌธ์์ด์ ์๋ก ๋ค์๋ฉด, wordDict = ['leet', 'code']๋ผ๊ณ ํ์ ๋, DP[x]๋ index x๊น์ง์ ๋ฌธ์์ด์ด wordDict๋ก ๋ง๋ค ์ ์๋ ์ง์ ์ฌ๋ถ๋ฅผ ๋ปํ๋ค. ๋ฐ๋ผ์ wordDict๋ฅผ ์ง์ ๋๋ฉฐ word์ ๊ธธ์ด๋ฅผ w๋ผ๊ณ ํ๋ค๋ฉด DP[x] = DP[x-w]๋ผ๊ณ ํ ์ ์๋ค. ์๋ ๊ทธ๋ฆผ ์ฐธ์กฐ.
๐ง๐ป๐ป 0207) prerequisite์ผ๋ก course์ ์์๊ฐ ์ ํด์ง ์ํ์์, ๋ชจ๋ course๋ฅผ ๋ค์ ์ ์๋ ์ง, ์ฆ ๋ชจ๋ ๋ ธ๋๋ฅผ traverseํ ์ ์๋ ์ง = ์์ ์ ๋ ฌ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๋ฌป๋ ๋ฌธ์ . ์์ ์ ๋ ฌ์ด ๊ฐ๋ฅํ ์ง ํ์ธํ๊ธฐ ์ํด์ , ์์ฑํ ๊ทธ๋ํ๊ฐ DAG(Directed Acyclic Graph; ๋ฐฉํฅ ๋น์ํ ๊ทธ๋ํ)๋ฅผ ๋ง์กฑํด์ผ ํ๋ค. queue๋ฅผ ๋ง๋ค์ด popleft()๋ก ๊บผ๋ผ ๋๋ง๋ค ๋ฐฉ๋ฌธ ํ์ธ. ๊บผ๋ธ ๋ ธ๋์ ๊ฐ์๋ฅผ ๋์ ํด์ ๊ตฌํ๋ค. ๊ตฌํ ๊ฒฐ๊ณผ์ ์ ์ฒด ๋ ธ๋์ ๊ฐ์๋ฅผ ๋น๊ตํ์ฌ ๊ฐ๋ค๋ฉด ๋ฐฉํฅ ๋น์ํ ๊ทธ๋ํ์ด๋ฏ๋ก true. ๊ฐ์ง ์๋ค๋ฉด ๋ฐฉํฅ ๋น์ํ ๊ทธ๋ํ๊ฐ ์๋๋ฏ๋ก false.
0236. Lowest Common Ancestor of a Binary Tree / 0046. Permutations
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if root:
if root == p or root == q:
return root
l = self.lowestCommonAncestor(root.left, p, q)
r = self.lowestCommonAncestor(root.right, p, q)
if l and r:
return root
else:
return l or r
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
def track():
if len(ans) == length:
ans_collections.append(ans[:])
else:
for x in range(length):
if len(ans) != 0 and nums[x] in ans:
continue
else:
ans.append(nums[x])
track()
ans.pop()
nums.sort()
ans_collections=[]
ans=[]
length = len(nums)
track()
return ans_collections
๐ง๐ป๐ป 0236) ์ฌ๊ทํจ์ ํ์ฉ. p์ q ๋ ธ๋์ LCA๋ฅผ ์ฐพ๋ ๋ฌธ์ . ์ด ๋ root ์์ฒด๊ฐ p ๋๋ q์ด๋ฉด root๊ฐ LCA์ด๋ฏ๋ก return root. ๊ทธ๋ ์ง ์๋ค๋ฉด ์ฌ๊ท์ ์ผ๋ก left / right ๊ฐ๊ฐ ํ๊ณ ๋ค์ด์ ํ์ธ. l๊ณผ r ๋ชจ๋ ์กด์ฌํ๋ค๋ฉด(์ฆ, p์ q ๊ฐ๊ฐ์ด l๊ณผ r ๋๋, r๊ณผ l์ ์กด์ฌํ๋ค๋ฉด) ๊ฒฐ๊ตญ์ root๊ฐ LCA. ๊ทธ๊ฒ ์๋๋ผ๋ฉด l ๋๋ r ํ์ชฝ์ p์ q ๋ ๊ฐ๊ฐ ๊ฐ์ด ์กด์ฌํ๋ค๋ฉด l ๋๋ r์ ๋ฆฌํด
๐ง๐ป๐ป0046) ์ ํ์ ์ธ backtracking ๋ฌธ์ . ๋จผ์ sortingํ๊ณ ์งํ. ์ด ๋, ์ ์ ํ ans๋ฅผ ์ฐพ์ ๋๋ง๋ค ans_collections list์ ans๋ฅผ appendํ๋ค. ans_collections.append(ans)๋ฅผ ํ๋ค๋ฉด, ans์ reference๋ฅผ appendํ๋ฏ๋ก, ์ค์ ans ์์ฒด์ current copy๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋. ๋ฐ๋ผ์ ์ดํ ans๊ฐ ๊ณ์ ๋ณํ ๋๋ง๋ค ans์ ๋ด์ฉ๋ ๋ณํ๋ค. ๋ฐ๋ผ์ ans_collections.append(ans[:]) ์ฝ๋(shallow copy of ans)๋ฅผ ์ฌ์ฉํด append๋ฅผ ํด์ผ ํ๋ค.
0056. Merge Intervals / 0011. Container with Most Water
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
ans=[]
intervals.sort(key=lambda x: x[0])
for start,end in intervals:
if not ans:
ans.append([start,end])
elif ans[-1][1] < start:
ans.append([start,end])
else: #if overlapped
ans[-1][1] = max(ans[-1][1], end)
return ans
class Solution:
def maxArea(self, height: List[int]) -> int:
res = 0
l,r = 0,len(height)-1
while l < r:
area = (r-l) * min(height[l], height[r])
res = max(res, area)
if height[l] < height[r]:
l += 1
else:
r -= 1
return res
๐ง๐ป๐ป 0056) ๋จผ์ ์ฒซ๋ฒ์งธ ์์๋ฅผ ์ค๋ฆ์ฐจ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ๋ค, intervals list ์ง์ for๋ฌธ์ผ๋ก ๋๋ฆฌ๋ฉด์ ๋ง์ง๋ง ans[-1][1]์ start ๋น๊ต. ๋ฐ๊ฟ์ผ ํ๋ฉด ans[-1][1] ์์ฒด๋ฅผ ๋ฐ๊ฟ
๐ง๐ป๐ป 0011) ํฌ ํฌ์ธํฐ O(N)์ผ๋ก ํ์ด์ผ TLE ๋์ง ์๋๋ค. ๋งจ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ํฌ์ธํฐ๋ฅผ ๋๊ณ ๋น์ฅ์ ๋ ๋ง๋ ์ค ์ต์๊ฐ์ ๊ฐ๋ฆฌํค๋ ๋ง๋๋ฅผ ์ค๊ฐ ๋ฐฉํฅ์ผ๋ก ์ด๋. ์ต๋๊ฐ์ ๊ฐ๋ฆฌํค๋ ๋ง๋๋ฅผ ์ด๋ํ๋ฉด ์ต์๊ฐ์ ๊ฐ๋ฆฌํค๋ ๋ง๋๋ณด๋ค ๊ฐ๊ฑฐ๋ ์์ ๋ง๋๋ง ์ค์ ๋ฉด์ ๊ณ์ฐ์ ์ ์ฉ๋๋ฏ๋ก ์ต์๊ฐ์ ๊ฐ๋ฆฌํค๋ ๋ง๋๋ฅผ ์ด๋ํ๋ ๋ฐ ์ด์ ์ ๋์ด์ผ ํ๋ค. ๊ทธ๋ ๋ค๋ฉด O(N) ์๊ฐ ๋ณต์ก๋๋ก ์ด๋ํด์ optimal solution์ ์ฐพ๋ ๊ฒ์ด ๋ณด์ฅ๋์ด ์์๊น? ์ฆ๋ช ํด๋ณด์.
โ optimal solution์ ๊ฐ์ง๋ answer ๋ ๋ง๋๊ฐ ๊ฐ๊ฐ i์ j์ ์๋ค๊ณ ๊ฐ์ .
: ๋น์ฅ ๋ ํฌ์ธํฐ ์ค ๋ ์์ ํฌ์ธํฐ๋ฅผ ์์ง์ด๋๊ฒ optimal ๋ณด์ฅ์์ ์ฆ๋ช ํด์ผ ํ๋ค. i์ j๊ฐ ์ผ๋จ optimal์ด๋ผ ๊ฐ์ . ๊ทธ๋ ๋ค๋ฉด i์ ์ผ์ชฝ ๋ง๋๋ค๊ณผ j์ ์ค๋ฅธ์ชฝ ๋ง๋๋ค์ ๋ฌด์กฐ๊ฑด min(i,j)๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค. ์๋ํ๋ฉด ๋ฐ๋๋ก ํฌ๋ค๋ฉด ๋ ํฐ ๋๋น์ ๋์ด๋ i ๋๋ j๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ. ๋ฐ๋ผ์ ๋งจ ์ฒ์ i๋ฅผ ๋งจ ์ผ์ชฝ, j๋ฅผ ๋งจ ์ค๋ฅธ์ชฝ์ ๋๊ณ ์์ํ๋ ๊ฑด, i์ ์ผ์ชฝ๊ณผ j์ ์ค๋ฅธ์ชฝ(๋น์ฐํ ๋ ๊ณณ ๋ค blank)์ด ๋ชจ๋ min(i,j)๋ณด๋ค ์๊ธฐ ๋๋ฌธ์ด๊ณ , ํ ์ํฉ์์ optimalํ ์ํ. ๊ทธ ์ํ์์ ๊ณ์ greedyํ๊ฒ optimalํ ์ํ๋ฅผ ์ฐพ์ ๋๊ฐ๋ฉฐ two pointers์ค min(i,j)๋ฅผ ์ค์์ชฝ์ผ๋ก ์ด๋ํ๋ฉฐ optimal solution updateํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค!
0019. Letter Combinations of a Phone Number / 0416. Partition Equal Subset Sum
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
res = []
digitToChar = {"2" : "abc", "3" : "def", "4" : "ghi", "5" : "jkl",
"6" : "mno", "7" : "qprs", "8" : "tuv", "9" : "wxyz"}
def track(i, curStr):
if len(curStr) == len(digits):
res.append(curStr)
return
for c in digitToChar[digits[i]]:
track(i+1, curStr+c)
if digits:
track(0, "")
return res
class Solution:
def canPartition(self, nums: List[int]) -> bool:
total = sum(nums)
if total % 2: return False
dp = set()
dp.add(0)
target = total // 2
for i in range(len(nums)):
nextDP = set()
for t in dp:
nextDP.add(t + nums[i])
nextDP.add(t)
dp = nextDP
return True if target in dp else False
๐ง๐ป๐ป 0017) ๊ธฐ๋ณธ backtracking ๋ฌธ์ . index๋ฅผ ํ์ฉํด ์์ง์ด๋ฉด ์ข ๋ ๋ฐฑํธ๋ํน ์๊ณ ๋ฆฌ์ฆ ์ฝ๋๋ฅผ ๊ฐ๋จํ๊ฒ ์งค ์ ์๋ค.
๐ง๐ป๐ป 0416) for๋ฌธ์ ์ง์ ๋๋ฆฌ๋ฉด์ ์๋ฅผ ๋ค์ด [1, 2, 3, 4]๋ผ๋ฉด [1,2]๊น์ง์ list์์ ๋ง๋ค ์ ์๋ ๋ชจ๋ subset์์ ๊ทธ ๋ค์ ์์ 3์ ๋ํ์ ๋์ ๋ง๋ค์ด์ง ์ ์๋ ๋ชจ๋ subset sum์ ๋ค์ update ํ๋ฉฐ ์ผ์ผ์ด DP set update
'LeetCode Problems > Medium' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ง๐ปโ๐ป LeetCode Medium Collections 3 - 19 Problems (1) | 2024.12.09 |
---|---|
๐ง๐ปโ๐ป LeetCode Medium Collections 2 - 20 Problems (1) | 2024.10.31 |
๋๊ธ