Skip to content

Commit 1e0422f

Browse files
authored
Merge pull request #744 from pmjuu/main
[Lyla] Week 02 solutions
2 parents 1341491 + 857d78f commit 1e0422f

File tree

5 files changed

+150
-0
lines changed

5 files changed

+150
-0
lines changed

โ€Ž3sum/pmjuu.py

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from typing import List
2+
3+
class Solution:
4+
def threeSum(self, nums: List[int]) -> List[List[int]]:
5+
result = []
6+
nums.sort() # sort nums before using two-pointers
7+
8+
for i, num in enumerate(nums):
9+
# skip duplicated targets
10+
if i > 0 and nums[i] == nums[i - 1]:
11+
continue
12+
13+
target = -num
14+
left, right = i + 1, len(nums) - 1
15+
16+
while left < right:
17+
if nums[left] + nums[right] == target:
18+
result.append([num, nums[left], nums[right]])
19+
20+
# skip duplicated numbers ( ex. nums = [-3 0 0 0 3 3] )
21+
while left < right and nums[left] == nums[left + 1]:
22+
left += 1
23+
while left < right and nums[right] == nums[right -1]:
24+
right -= 1
25+
26+
left += 1
27+
right -= 1
28+
elif nums[left] + nums[right] < target:
29+
left += 1
30+
else:
31+
right -= 1
32+
33+
return result
34+
35+
36+
# Time Complexity: O(n^2)
37+
# - Sorting takes O(n log n).
38+
# - The outer loop runs O(n) times, and the two-pointer approach inside runs O(n) for each iteration.
39+
# - Combined, the overall time complexity is O(n^2).
40+
41+
# Space Complexity: O(k)
42+
# - The result list uses O(k) space, where k is the number of unique triplets in the output.

โ€Žclimbing-stairs/pmjuu.py

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
class Solution:
2+
def climbStairs(self, n: int) -> int:
3+
# dp[i] represents the number of distinct ways to climb to the ith step.
4+
# Base cases:
5+
# - There is 1 way to reach step 0 (doing nothing).
6+
# - There is 1 way to reach step 1 (a single step).
7+
dp = [0] * (n + 1)
8+
dp[0], dp[1] = 1, 1
9+
10+
for i in range(2, n + 1):
11+
dp[i] = dp[i - 1] + dp[i - 2]
12+
13+
return dp[n]
14+
15+
# Complexity
16+
# - time: O(n)
17+
# - space: O(n)
18+
19+
class Solution:
20+
def climbStairs(self, n: int) -> int:
21+
prev, curr = 1, 1
22+
23+
for _ in range(2, n + 1):
24+
prev, curr = curr, prev + curr
25+
26+
return curr
27+
28+
# Complexity
29+
# - time: O(n)
30+
# - space: O(1)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from typing import List, Optional
2+
3+
# Definition for a binary tree node.
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+
10+
class Solution:
11+
def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
12+
inorder_map = {value: idx for idx, value in enumerate(inorder)}
13+
self.preorder_idx = 0
14+
15+
def helper(left: int, right: int) -> Optional[TreeNode]:
16+
if left > right:
17+
return None
18+
19+
root_val = preorder[self.preorder_idx]
20+
self.preorder_idx += 1
21+
22+
root = TreeNode(root_val)
23+
root.left = helper(left, inorder_map[root_val] - 1)
24+
root.right = helper(inorder_map[root_val] + 1, right)
25+
26+
return root
27+
28+
return helper(0, len(inorder) - 1)
29+
30+
31+
# Time Complexity: O(n)
32+
# - Each node is visited exactly once in preorder, and the dictionary lookup in inorder_map takes O(1) per node.
33+
34+
# Space Complexity: O(n)
35+
# - The hash map (inorder_map) uses O(n) space.
36+
# - The recursion stack uses up to O(h) space, where h is the height of the tree (O(n) in the worst case, O(log n) for a balanced tree).

โ€Ždecode-ways/pmjuu.py

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class Solution:
2+
def numDecodings(self, s: str) -> int:
3+
if s[0] == "0":
4+
return 0
5+
6+
prev, curr = 1, 1
7+
8+
for i in range(1, len(s)):
9+
temp = curr
10+
11+
if s[i] == "0":
12+
if s[i - 1] in ("1", "2"):
13+
curr = prev
14+
else:
15+
return 0
16+
else:
17+
two_num = int(s[i - 1] + s[i])
18+
is_two_num_decoded = 10 <= two_num <= 26
19+
if is_two_num_decoded:
20+
curr += prev
21+
22+
prev = temp
23+
24+
return curr
25+
26+
27+
# Time Complexity: O(n)
28+
# - The loop iterates through the string once, where n is the length of the string.
29+
30+
# Space Complexity: O(1)
31+
# - Only two variables (prev and curr) are used, independent of the input size.

โ€Žvalid-anagram/pmjuu.py

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from collections import Counter
2+
3+
class Solution:
4+
def isAnagram(self, s: str, t: str) -> bool:
5+
return Counter(s) == Counter(t)
6+
7+
# Python์˜ collections.Counter๋Š” ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
8+
# ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
9+
# Counter๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜์˜ ์—ฐ์‚ฐ์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ๊ฐ ๋ฌธ์ž์—ด์˜ ๋ฌธ์ž๋ฅผ ํ•œ ๋ฒˆ์”ฉ ์ˆœํšŒํ•ฉ๋‹ˆ๋‹ค.
10+
# ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
11+
# ๊ฐ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด Counter ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ, ์ตœ์•…์˜ ๊ฒฝ์šฐ ๊ฐ ๋ฌธ์ž๋งˆ๋‹ค ๋นˆ๋„๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ O(n) ํฌ๊ธฐ์˜ ํ•ด์‹œํ…Œ์ด๋ธ”์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

0 commit comments

Comments
ย (0)