Skip to content

Commit b534b77

Browse files
author
zhangbingxu
committed
homework-3
1 parent b84c233 commit b534b77

File tree

11 files changed

+323
-0
lines changed

11 files changed

+323
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode(object):
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
8+
9+
class Solution(object):
10+
def zigzagLevelOrder(self, root):
11+
"""
12+
:type root: TreeNode
13+
:rtype: List[List[int]]
14+
"""
15+
16+
self.result = []
17+
self.travel(root, 0)
18+
return self.result
19+
20+
def travel(self, curr, level):
21+
result = self.result
22+
if not curr:
23+
return
24+
elif len(result) <= level:
25+
result.append([curr.val])
26+
elif level % 2 == 0:
27+
result[level].extend([curr.val])
28+
else:
29+
result[level].insert(0, curr.val)
30+
31+
self.travel(curr.left, level + 1)
32+
self.travel(curr.right, level + 1)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode(object):
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
8+
9+
class Solution(object):
10+
def maxPathSum(self, root):
11+
"""
12+
:type root: TreeNode
13+
:rtype: int
14+
"""
15+
16+
self.max = root.val
17+
self.maxPath(root)
18+
return self.max
19+
20+
def maxPath(self, root):
21+
if not root:
22+
return 0
23+
left = max(0, self.maxPath(root.left))
24+
right = max(0, self.maxPath(root.right))
25+
self.max = max(self.max, left + right + root.val)
26+
return max(left, right) + root.val
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode(object):
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
8+
# path + [root.val] vs path.append() ???
9+
10+
11+
class Solution(object):
12+
def pathSum(self, root, sum):
13+
"""
14+
:type root: TreeNode
15+
:type sum: int
16+
:rtype: [List[int]]
17+
"""
18+
19+
result = []
20+
self.findPath(root, sum, [], result)
21+
return result
22+
23+
def findPath(self, root, rest, path, result):
24+
if not root:
25+
return
26+
if not root.left and not root.right and root.val == rest:
27+
result.append(path + [root.val])
28+
self.findPath(root.left, rest - root.val,
29+
path + [root.val], result)
30+
self.findPath(root.right, rest - root.val,
31+
path + [root.val], result)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
class Solution(object):
2+
def findWords(self, board, words):
3+
"""
4+
:type board: List[List[str]]
5+
:type words: List[str]
6+
:rtype: List[str]
7+
"""
8+
trie = self.makeTrieTree({}, words)
9+
self.res = set()
10+
self.used = [[False] * len(board[0]) for _ in range(len(board))]
11+
for i in range(len(board)):
12+
for j in range(len(board[0])):
13+
self.dfs(board, i, j, trie, '')
14+
return list(self.res)
15+
16+
def dfs(self, board, i, j, trie, pre):
17+
if '#' in trie:
18+
self.res.add(pre)
19+
if i < 0 or i >= len(board) or j < 0 or j >= len(board[0]):
20+
return
21+
22+
if not self.used[i][j] and board[i][j] in trie:
23+
self.used[i][j] = True
24+
self.dfs(board, i + 1, j, trie[board[i][j]], pre + board[i][j])
25+
self.dfs(board, i - 1, j, trie[board[i][j]], pre + board[i][j])
26+
self.dfs(board, i, j + 1, trie[board[i][j]], pre + board[i][j])
27+
self.dfs(board, i, j - 1, trie[board[i][j]], pre + board[i][j])
28+
self.used[i][j] = False
29+
30+
def makeTrieTree(self, trie, words):
31+
for word in words:
32+
t = trie
33+
for letter in word:
34+
if letter not in t:
35+
t[letter] = {}
36+
t = t[letter]
37+
t['#'] = '#'
38+
39+
return trie
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode(object):
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
8+
9+
class Solution(object):
10+
def hasPathSum(self, root, sum):
11+
"""
12+
:type root: TreeNode
13+
:type sum: int
14+
:rtype: bool
15+
"""
16+
17+
if not root:
18+
return False
19+
20+
if not root.left and not root.right and sum == root.val:
21+
return True
22+
23+
sum = sum - root.val
24+
25+
return self.hasPathSum(root.left, sum) or self.hasPathSum(root.right, sum)
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Definition for singly-linked list.
2+
class ListNode(object):
3+
def __init__(self, x):
4+
self.val = x
5+
self.next = None
6+
7+
8+
class Solution(object):
9+
def detectCycle(self, head):
10+
"""
11+
:type head: ListNode
12+
:rtype: ListNode
13+
"""
14+
15+
if not head:
16+
return None
17+
18+
fast, slow, entr = head, head, head
19+
20+
while (fast.next and fast.next.next and slow.next):
21+
fast = fast.next.next
22+
slow = slow.next
23+
24+
if fast == slow:
25+
while(slow != entr):
26+
slow = slow.next
27+
entr = entr.next
28+
return entr
29+
30+
return None
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution(object):
2+
def generateParenthesis(self, n):
3+
"""
4+
:type n: int
5+
:rtype: List[str]
6+
"""
7+
self.list = []
8+
self.max = n
9+
self.backtrack('', 0, 0)
10+
return self.list
11+
12+
def backtrack(self, str, open, close):
13+
if len(str) == self.max * 2:
14+
self.list.append(str)
15+
return
16+
17+
if open < self.max:
18+
self.backtrack(str + '(', open + 1, close)
19+
if close < open:
20+
self.backtrack(str + ')', open, close + 1)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class Solution(object):
2+
def isValidSudoku(self, board):
3+
"""
4+
:type board: List[List[str]]
5+
:rtype: bool
6+
"""
7+
8+
if not board:
9+
return False
10+
11+
m, n = len(board), len(board[0])
12+
check_row = [[0 for i in range(9)] for j in range(9)]
13+
check_col = [[0 for i in range(9)] for j in range(9)]
14+
check_box = [[0 for i in range(9)] for j in range(9)]
15+
16+
for i in range(m):
17+
for j in range(n):
18+
if not board[i][j] == '.':
19+
num = int(board[i][j]) - 1
20+
k = i / 3 * 3 + j / 3 # ??
21+
if check_row[i][num] or check_col[j][num] or check_box[k][num]:
22+
return False
23+
24+
check_row[i][num] = check_col[j][num] = check_box[k][num] = 1
25+
26+
return True
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode(object):
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
8+
class Solution(object):
9+
def largestValues(self, root):
10+
"""
11+
:type root: TreeNode
12+
:rtype: List[int]
13+
"""
14+
15+
self.list = []
16+
self.findDfs(root, 0)
17+
return
18+
19+
20+
def findDfs(self, node, level):
21+
if not node: return None
22+
23+
if level == len(self.list):
24+
self.list.append(node.val)
25+
else:
26+
self.list[level] = max(self.list[level], node.val)
27+
28+
self.findDfs(node.left, level + 1)
29+
self.findDfs(node.right, level + 1)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
class Solution(object):
2+
def solveNQueens(self, n):
3+
"""
4+
:type n: int
5+
:rtype: List[List[str]]
6+
"""
7+
board = [['.' for i in range(n)] for j in range(n)]
8+
self.res = []
9+
self.dfs(board, 0)
10+
return self.res
11+
12+
def dfs(self, board, index):
13+
if index == len(board):
14+
self.res.append(self.construct(board))
15+
return
16+
17+
for i in range(len(board)):
18+
if self.validate(board, i, index):
19+
board[i][index] = 'Q'
20+
self.dfs(board, index + 1)
21+
board[i][index] = '.'
22+
23+
def validate(self, board, x, y):
24+
for i in range(len(board)):
25+
for j in range(len(board[0])):
26+
if board[i][j] == 'Q' and (x + j == y + i or x + y == i + j or x == i):
27+
return False
28+
return True
29+
30+
def construct(self, board):
31+
ll = []
32+
for i in range(len(board)):
33+
ll.append(''.join(board[i]))
34+
return ll

0 commit comments

Comments
 (0)