Skip to content

Commit 27da15e

Browse files
authored
Merge pull request DaleStudy#2338 from doh6077/main
[doh6077] WEEK 15 solutions
2 parents 0974a26 + 04fcf31 commit 27da15e

File tree

6 files changed

+183
-0
lines changed

6 files changed

+183
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from collections import deque
2+
# 102. Binary Tree Level Order Traversal
3+
class Solution:
4+
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
5+
# 1. Edge Case: Empty Tree
6+
if not root:
7+
return []
8+
9+
result = []
10+
queue = deque([root])
11+
12+
while queue:
13+
# 2. Capture the number of nodes at the current level
14+
level_size = len(queue)
15+
current_level_nodes = []
16+
17+
for _ in range(level_size):
18+
current_node = queue.popleft()
19+
current_level_nodes.append(current_node.val)
20+
21+
# 3. Add children to the queue for the NEXT level
22+
if current_node.left:
23+
queue.append(current_node.left)
24+
if current_node.right:
25+
queue.append(current_node.right)
26+
27+
# Add the finished level to our result
28+
result.append(current_level_nodes)
29+
30+
return result

house-robber/doh6077.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Week1
2+
# 198. House Robber
3+
# Tabulation
4+
# Dynamic Programming
5+
6+
7+
# two options: either rober or not
8+
9+
class Solution:
10+
def rob(self, nums: List[int]) -> int:
11+
# Top Down DP
12+
13+
n = len(nums)
14+
15+
if n == 1:
16+
return nums[0]
17+
if n == 2:
18+
return max(nums[0], nums[1])
19+
memo = {0: nums[0], 1: max(nums[0], nums[1])}
20+
def helper(i):
21+
22+
if i in memo:
23+
return memo[i]
24+
else:
25+
memo[i]= max(nums[i] + helper(i-2), helper(i-1))
26+
return memo[i]
27+
28+
return helper(n-1)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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+
# Time Complexity O(N)
9+
def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
10+
ans = []
11+
final = 0
12+
def dfs(node):
13+
nonlocal final
14+
if not node:
15+
return
16+
dfs(node.left)
17+
ans.append(node.val)
18+
if len(ans) == k:
19+
final = node.val
20+
if len(ans) < k:
21+
dfs(node.right)
22+
dfs(root)
23+
return final
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# 5. Longest Palindromic Substring
2+
# https://leetcode.com/problems/longest-palindromic-substring/
3+
4+
5+
class Solution:
6+
def longestPalindrome(self, s: str) -> str:
7+
#Expand Around Center
8+
res = ""
9+
resLen = 0
10+
11+
for i in range(len(s)):
12+
# odd length
13+
l, r = i, i
14+
while l >= 0 and r < len(s) and s[l] == s[r]:
15+
if (r - l + 1) > resLen:
16+
res = s[l:r+1]
17+
resLen = r - l + 1
18+
l -= 1
19+
r += 1
20+
21+
# even length
22+
l, r = i, i + 1
23+
while l >= 0 and r < len(s) and s[l] == s[r]:
24+
if (r - l + 1) > resLen:
25+
res = s[l:r+1]
26+
resLen = r - l + 1
27+
l -= 1
28+
r += 1
29+
30+
return res

rotate-image/doh6077.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# https://leetcode.com/problems/rotate-image/
2+
# 48. Rotate Image
3+
class Solution:
4+
def rotate(self, matrix: List[List[int]]) -> None:
5+
"""
6+
Do not return anything, modify matrix in-place instead.
7+
"""
8+
# First Try - Thought process:
9+
# group values by column index (j) to rebuild rows
10+
# Brute force: create an extra 2D matrix and then copy it back into matrix
11+
# Needs optimization: this approach uses extra space
12+
matrix_result = [[] for _ in range(len(matrix))]
13+
for i in reversed(matrix):
14+
for j, value in enumerate(i):
15+
matrix_result[j].append(value)
16+
for r in range(len(matrix)):
17+
matrix[r] = matrix_result[r]
18+
19+
# Youtube Solution - Transpose Operation + hr
20+
# Swap i, js
21+
n = len(matrix)
22+
for i in range(n):
23+
for j in range(i + 1, n):
24+
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
25+
26+
# Reflection
27+
for i in range(n):
28+
for j in range(n // 2):
29+
matrix[i][j], matrix[i][n - j - 1] = matrix[i][n - j - 1], matrix[i][j]

subtree-of-another-tree/doh6077.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from collections import deque
2+
from typing import Optional
3+
4+
# class TreeNode:
5+
# def __init__(self, val=0, left=None, right=None):
6+
# self.val = val
7+
# self.left = left
8+
# self.right = right
9+
# 572. Subtree of Another Tree
10+
# https://leetcode.com/problems/subtree-of-another-tree/description/
11+
class Solution:
12+
def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
13+
# Use BFS => Queue
14+
# Edge cases
15+
if subRoot is None:
16+
return True
17+
if root is None:
18+
return False
19+
20+
def helper(node: Optional[TreeNode], subNode: Optional[TreeNode]) -> bool:
21+
if node is None and subNode is None:
22+
return True
23+
if node is None or subNode is None:
24+
return False
25+
if node.val != subNode.val:
26+
return False
27+
return helper(node.left, subNode.left) and helper(node.right, subNode.right)
28+
29+
q = deque([root])
30+
31+
while q:
32+
curr = q.popleft()
33+
34+
# Only attempt full compare when root values match
35+
if curr.val == subRoot.val and helper(curr, subRoot):
36+
return True
37+
38+
if curr.left:
39+
q.append(curr.left)
40+
if curr.right:
41+
q.append(curr.right)
42+
43+
return False

0 commit comments

Comments
 (0)