-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpythonMain.py
More file actions
161 lines (146 loc) · 4.67 KB
/
pythonMain.py
File metadata and controls
161 lines (146 loc) · 4.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
from collections import deque
from binaryTree import BinaryTreeNode
class Solutions:
# O(n) time and O(n) space by hashing
def twoSumHash(self, nums, target):
hash_map = {}
for i, num in enumerate(nums):
complement = target - num
if complement in hash_map:
return [hash_map[complement], i]
hash_map[num] = i
# slow nested loop
def twoSumLoop(self, nums, target):
for i in range(len(nums)):
for j in range(len(nums)): # nested loop mess
if i != j and nums[i] + nums[j] == target:
return i, j
# builtin sort
def simpleSortBuiltIn(self, nums):
return sorted(nums)
# poor O(n^2)
def simpleSortBubble(self, nums):
n = len(nums)
for i in range(n):
for j in range(n - i - 1):
if nums[j] > nums[j + 1]:
nums[j], nums[j + 1] = nums[j + 1], nums[j]
return nums
def simpleSortMerge(self, nums):
if len(nums) <= 1:
return nums
mid = len(nums) // 2
left = nums[:mid]
right = nums[mid:] # split array
left = self.simpleSortMerge(left)
right = self.simpleSortMerge(right)
return self.merge(left, right)
# merge helper
def merge(self, left, right):
sorted_list = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
sorted_list.append(left[i])
i += 1
else:
sorted_list.append(right[j])
j += 1
sorted_list.extend(left[i:])
sorted_list.extend(right[j:])
return sorted_list
# quick sort with recursive pivot
def simpleSortQuick(self, nums):
if len(nums) <= 1:
return nums
pivot = nums[0]
left = []
right = []
for num in nums[1:]:
if num < pivot:
left.append(num)
else:
right.append(num)
return self.simpleSortQuick(left) + [pivot] + self.simpleSortQuick(right)
# selection and insertion are similar
def simpleSortSelection(self, nums):
n = len(nums)
for i in range(n):
min_index = i
for j in range(i + 1, n):
if nums[j] < nums[min_index]:
min_index = j
nums[i], nums[min_index] = nums[min_index], nums[i]
return nums
def simpleSortInsertion(self, nums):
n = len(nums)
for i in range(1, n):
key = nums[i]
j = i - 1
while j >= 0 and key < nums[j]:
nums[j + 1] = nums[j]
j -= 1
nums[j + 1] = key
return nums
# merge arrays with two "pointers"
def arrayMergeNormal(self, nums1, m, nums2, n):
i = m - 1
j = n - 1
k = m + n - 1
while i >= 0 and j >= 0:
if nums1[i] > nums2[j]:
nums1[k] = nums1[i]
i -= 1
else:
nums1[k] = nums2[j]
j -= 1
k -= 1
while j >= 0:
nums1[k] = nums2[j]
j -= 1
k -= 1
return nums1
# merge arrays with built-in sort
def arrayMergeBuiltIn(self, nums1, m, nums2, n):
nums1[m:] = nums2
return sorted(nums1)
# merge arrays manually with loops
def arrayMergeLoop(self, nums1, m, nums2, n):
arr = []
i, j = 0, 0
while i < m and j < n:
if nums1[i] < nums2[j]:
arr.append(nums1[i])
i += 1
else:
arr.append(nums2[j])
j += 1
while i < m:
arr.append(nums1[i])
i += 1
while j < n:
arr.append(nums2[j])
j += 1
return arr
# dfs for min depth of tree
def minimumBinaryTreeDepthDFS(self, root):
if not root:
return 0
left = self.minimumBinaryTreeDepthDFS(root.left)
right = self.minimumBinaryTreeDepthDFS(root.right)
if left == 0 or right == 0:
return max(left, right) + 1
return min(left, right) + 1
# bfs for min depth of tree
def minimumBinaryTreeDepthBFS(self, root):
if not root:
return 0
queue = deque([(root, 1)])
while queue:
node, depth = queue.popleft()
if not node.left and not node.right:
return depth
if node.left:
queue.append((node.left, depth + 1))
if node.right:
queue.append((node.right, depth + 1))