Skip to content

Commit 5bcbd05

Browse files
authored
[parkhojeong] WEEK 04 Solutions (#2749)
* merge two sorted lists solution * maximum depth of binary tree solution * find minimum in rotated sorted array solution * word search solution * coin change solution * optimize word-search solution * optimize find-minimum-in-rotated-sorted-array * optimize merge-two-sorted-lists * optimize word-search
1 parent 4ab4ada commit 5bcbd05

5 files changed

Lines changed: 127 additions & 0 deletions

File tree

coin-change/parkhojeong.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution:
2+
def coinChange(self, coins: List[int], amount: int) -> int:
3+
if amount == 0:
4+
return 0
5+
6+
dp = [1 if x in coins else 0 for x in range(amount + 1)]
7+
MAX_VALUE = sys.maxsize
8+
9+
for i in range(1, amount + 1):
10+
if dp[i] != 0:
11+
continue
12+
13+
dp[i] = MAX_VALUE
14+
for coin in coins:
15+
if i - coin > 0 and dp[i - coin] > 0:
16+
dp[i] = min(dp[i - coin] + 1, dp[i])
17+
18+
if dp[amount] == MAX_VALUE:
19+
return -1
20+
21+
return dp[amount]
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution:
2+
def findMin(self, nums: List[int]) -> int:
3+
lo, hi = 0, len(nums) - 1
4+
while lo < hi:
5+
mid = (lo + hi) // 2
6+
7+
if nums[lo] < nums[hi]:
8+
return nums[lo]
9+
10+
if nums[mid] < nums[hi]:
11+
hi = mid
12+
else:
13+
lo = mid + 1
14+
15+
return nums[lo]
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
class Solution:
8+
def maxDepth(self, root: Optional[TreeNode]) -> int:
9+
return self.dfs(root, 0)
10+
11+
def dfs(self, root, depth) -> int:
12+
if not root:
13+
return depth
14+
15+
return max(self.dfs(root.left, depth + 1), self.dfs(root.right, depth + 1))
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Definition for singly-linked list.
2+
# class ListNode:
3+
# def __init__(self, val=0, next=None):
4+
# self.val = val
5+
# self.next = next
6+
class Solution:
7+
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
8+
dummy_head = ListNode()
9+
cur = dummy_head
10+
11+
while list1 and list2:
12+
if list1.val <= list2.val:
13+
cur.next = list1
14+
list1 = list1.next
15+
else:
16+
cur.next = list2
17+
list2 = list2.next
18+
cur = cur.next
19+
20+
if list1:
21+
cur.next = list1
22+
elif list2:
23+
cur.next = list2
24+
25+
return dummy_head.next

word-search/parkhojeong.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from collections import Counter
2+
from typing import List
3+
4+
class Solution:
5+
def exist(self, board: List[List[str]], word: str) -> bool:
6+
row_len, col_len = len(board), len(board[0])
7+
8+
board_freq = Counter(ch for row in board for ch in row)
9+
10+
for ch, need in Counter(ch for ch in word).items():
11+
if board_freq.get(ch, 0) < need:
12+
return False
13+
14+
if board_freq.get(word[0], 0) > board_freq.get(word[-1], 0):
15+
word = word[::-1]
16+
17+
DIRECTIONS = ((-1, 0), (1, 0), (0, -1), (0, 1))
18+
MARKER = ""
19+
20+
def in_bounds(r: int, c: int) -> bool:
21+
return 0 <= r < row_len and 0 <= c < col_len
22+
23+
def backtrack(r: int, c: int, idx: int) -> bool:
24+
if idx == len(word) - 1:
25+
return True
26+
27+
saved_char = board[r][c]
28+
board[r][c] = MARKER
29+
board_freq[saved_char] -= 1
30+
31+
for dr, dc in DIRECTIONS:
32+
nr, nc = r + dr, c + dc
33+
next_ch = word[idx + 1]
34+
35+
if (in_bounds(nr, nc)
36+
and board[nr][nc] != MARKER
37+
and board[nr][nc] == next_ch
38+
and board_freq[next_ch] > 0
39+
and backtrack(nr, nc, idx + 1)):
40+
return True
41+
42+
board[r][c] = saved_char
43+
board_freq[saved_char] += 1
44+
return False
45+
46+
for r in range(row_len):
47+
for c in range(col_len):
48+
if board[r][c] == word[0] and backtrack(r, c, 0):
49+
return True
50+
51+
return False

0 commit comments

Comments
 (0)