-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
95 changed files
with
13,782 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
import collections | ||
class BSTNode: | ||
def __init__(self, data=None, left=None, right=None): | ||
self.data, self.left, self.right = data, left, right | ||
|
||
class TreeNode: | ||
def __init__(self, label=None, edges=None): | ||
self.label = label | ||
self.edges = edges | ||
|
||
def is_bst(tree, min_val=float('-inf'), max_val=float('inf')): | ||
if not tree: | ||
return True | ||
elif not min_val <= tree.data <= max_val: | ||
return False | ||
return is_bst(tree.left, min_val, tree.data) and is_bst(tree.right, tree.data, max_val) | ||
|
||
|
||
def find_k_largest_elements(tree, k): | ||
def find_k_largest_elements_helper(tree): | ||
if tree and len(k_largest) < k: | ||
find_k_largest_elements_helper(tree.right) | ||
if len(k_largest) < k: | ||
k_largest.append(tree.data) | ||
find_k_largest_elements_helper(tree.left) | ||
|
||
k_largest = [] | ||
find_k_largest_elements_helper(tree) | ||
return k_largest | ||
|
||
|
||
def lca_recursive(tree, s, b): | ||
if s.data == tree.data or b.data == tree.data: | ||
return tree.data | ||
if s.data < tree.data < b.data: | ||
return tree.data | ||
if s.data < tree.data and b.data < tree.data: | ||
return lca_recursive(tree.left, s, b) | ||
if s.data > tree.data and b.data > tree.data: | ||
return lca_recursive(tree.right, s, b) | ||
|
||
def lca_iterative(tree, s, b): | ||
while tree.data < s.data or tree.data > b.data: | ||
while tree.data < s.data: | ||
tree = tree.right | ||
while tree.data > b.data: | ||
tree = tree.left | ||
|
||
return tree.data | ||
|
||
def lca_postorder(tree, s, b): | ||
pass | ||
|
||
class Edge: | ||
def __init__(self, root=None, length=None): | ||
self.root = root | ||
self.length = length | ||
|
||
def diameter(tree): | ||
class HeightAndDiameter: | ||
def __init__(self, height=None, diameter=None): | ||
self.height = height | ||
self.diameter = diameter | ||
|
||
def compute(t): | ||
diameter = float('-inf') | ||
heights = [0.0, 0.0] | ||
for e in t.edges: | ||
h_d = compute(e.root) | ||
if h_d.height + e.length > heights[0]: | ||
heights = [h_d.height + e.length, heights[0]] | ||
elif h_d.height + e.length > heights[1]: | ||
heights[1] = h_d.height + e.length | ||
diameter = max(diameter, h_d.diameter) | ||
|
||
return HeightAndDiameter(heights[0], max(diameter, heights[0], + heights[1])) | ||
|
||
return compute(tree).diameter if tree else 0 | ||
|
||
def invertTree(root): | ||
""" | ||
:type root: TreeNode | ||
:rtype: TreeNode | ||
""" | ||
if not root or not root.left and not root.right: | ||
return root | ||
|
||
stack = [root] | ||
while stack: | ||
node = stack.pop() | ||
node.left, node.right = node.right, node.left | ||
if node.left: | ||
stack.append(node.left) | ||
if node.right: | ||
stack.append(node.right) | ||
|
||
return root | ||
|
||
def create_bstree(): | ||
n = BSTNode(19) | ||
n.left = BSTNode(7) | ||
n.left.left = BSTNode(3) | ||
n.left.left.left = BSTNode(2) | ||
n.left.left.right = BSTNode(5) | ||
n.left.right = BSTNode(11) | ||
n.left.right.right = BSTNode(17) | ||
n.left.right.right.left = BSTNode(13) | ||
n.right = BSTNode(43) | ||
n.right.left = BSTNode(23) | ||
n.right.left.right = BSTNode(37) | ||
n.right.left.right.left = BSTNode(29) | ||
n.right.left.right.left.right = BSTNode(31) | ||
n.right.left.right.right = BSTNode(41) | ||
n.right.right = BSTNode(47) | ||
n.right.right.right = BSTNode(53) | ||
return n | ||
def create_btree(): | ||
tb = TreeNode('B') | ||
tb.edges = [Edge(tb, 7),Edge(tb, 14),Edge(tb, 73)] | ||
tc = TreeNode('C') | ||
return tb | ||
|
||
if __name__ == '__main__': | ||
bstree = create_bstree() | ||
btree = create_btree | ||
#print is_bst(tree) | ||
#print find_k_largest_elements(tree, 3) | ||
#smaller = tree.left.right.right.left | ||
#larger = tree.left.right.right | ||
#print lca_iterative(tree, smaller, larger) | ||
#print lca_recursive(tree, smaller, larger) | ||
#print diameter(tree) | ||
|
||
tree = invertTree(bstree) | ||
print tree.data, tree.left.data, tree.right.data |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
class Trie: | ||
class TrieNode: | ||
def __init__(self, label=None, data=None): | ||
self.label = label | ||
self.data = data | ||
self.children = [] | ||
|
||
def __getitem__(self, key): | ||
return self.children[key] | ||
|
||
def add_child(self, key, data): | ||
if self.children: | ||
self.children.append() | ||
|
||
def __init__(self): | ||
pass | ||
|
||
def insert(self, word): | ||
pass | ||
|
||
def search(self, word): | ||
pass |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
class TreeNode: | ||
def __init__(self, val, left=None, right=None): | ||
self.val = val | ||
self.left = left | ||
self.right = right | ||
|
||
def __repr__(self): | ||
return 'TreeNode({})'.format(self.val) | ||
|
||
def is_bst(tree, min_val=float('-inf'), max_val=float('inf')): | ||
if not tree: | ||
return True | ||
elif not min_val <= tree.val <= max_val: | ||
return False | ||
return is_bst(tree.left, min_val, tree.val) and is_bst(tree.right, tree.val, max_val) | ||
|
||
|
||
def deserialize(string): | ||
if string == '{}': | ||
return None | ||
nodes = [None if val == 'null' else TreeNode(int(val)) | ||
for val in string.strip('[]{}').split(',')] | ||
kids = nodes[::-1] | ||
root = kids.pop() | ||
for node in nodes: | ||
if node: | ||
if kids: node.left = kids.pop() | ||
if kids: node.right = kids.pop() | ||
return root | ||
|
||
|
||
def drawtree(root): | ||
def height(root): | ||
return 1 + max(height(root.left), height(root.right)) if root else -1 | ||
|
||
def jumpto(x, y): | ||
t.penup() | ||
t.goto(x, y) | ||
t.pendown() | ||
|
||
def draw(node, x, y, dx): | ||
if node: | ||
t.goto(x, y) | ||
jumpto(x, y - 20) | ||
t.write(node.val, align='center', font=('Arial', 12, 'normal')) | ||
draw(node.left, x - dx, y - 60, dx / 2) | ||
jumpto(x, y - 20) | ||
draw(node.right, x + dx, y - 60, dx / 2) | ||
|
||
import turtle | ||
t = turtle.Turtle() | ||
t.speed(0); | ||
turtle.delay(0) | ||
h = height(root) | ||
jumpto(0, 30 * h) | ||
draw(root, 0, 30 * h, 40 * h) | ||
t.hideturtle() | ||
turtle.mainloop() | ||
|
||
|
||
if __name__ == '__main__': | ||
# drawtree(deserialize('[1,2,3,null,null,4,null,null,5]')) | ||
drawtree(deserialize('[2,1,3,0,7,9,1,2,null,1,0,null,null,8,8,null,null,null,null,7]')) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
def books(book_list, people): | ||
def is_possible(arr, readers, curr_min): | ||
students_required = 1 | ||
curr_sum = 0 | ||
for i in range(len(arr)): | ||
if arr[i] > curr_min: | ||
return False | ||
if curr_sum + arr[i] > curr_min: | ||
students_required += 1 | ||
curr_sum = arr[i] | ||
if students_required > readers: | ||
return False | ||
else: | ||
curr_sum += arr[i] | ||
|
||
return True | ||
|
||
if len(book_list) < people: | ||
raise ValueError('Num people exceed num books') | ||
|
||
n = sum(book_list) | ||
lo, hi = 0, n | ||
res = float('inf') | ||
while lo <= hi: | ||
m = (lo + hi) // 2 | ||
if is_possible(book_list, people, m): | ||
res = min(res, m) | ||
hi = m - 1 # check smaller | ||
else: | ||
lo = m + 1 | ||
|
||
return res | ||
|
||
if __name__ == '__main__': | ||
arr = [12, 34, 67, 90] | ||
m = 2 | ||
print(books(arr, m)) |
Oops, something went wrong.