|
| 1 | +class Node: |
| 2 | + def __init__(self, val): |
| 3 | + self.val = val |
| 4 | + self.next_list = [] |
| 5 | + self.max_len = 0 |
| 6 | + |
| 7 | + def append(self, next_val): |
| 8 | + self.next_list.append(next_val) |
| 9 | + |
| 10 | + def is_leaf(self): |
| 11 | + return len(self.next_list) == 0 |
| 12 | + |
| 13 | + |
| 14 | +def max_len_incre_sub_arr(arr): |
| 15 | + node_arr = map(lambda val: Node(val), arr) |
| 16 | + |
| 17 | + def max_len_incre_sub_arr_detail(beg_idx): |
| 18 | + if node_arr[beg_idx].max_len == 0: |
| 19 | + if beg_idx == len(arr) - 1: |
| 20 | + node_arr[beg_idx].max_len = 1 |
| 21 | + else: |
| 22 | + candidates = filter(lambda node: node.val > node_arr[beg_idx].val, |
| 23 | + [max_len_incre_sub_arr_detail(i) for i in range(beg_idx + 1, len(arr))]) |
| 24 | + if len(candidates) == 0: |
| 25 | + node_arr[beg_idx].max_len = 1 |
| 26 | + else: |
| 27 | + max_len = max(map(lambda node: node.max_len, candidates)) |
| 28 | + node_arr[beg_idx].max_len = 1 + max_len |
| 29 | + node_arr[beg_idx].next_list = filter(lambda node: node.max_len == max_len, candidates) |
| 30 | + |
| 31 | + return node_arr[beg_idx] |
| 32 | + |
| 33 | + def print_tree(root_node): |
| 34 | + def dfs_detail(node_ref, node_level): |
| 35 | + blank_str = ''.join([" "] * node_level)[:-1] + '|_' if node_level > 0 else 'root' |
| 36 | + |
| 37 | + print '%-50s' % (blank_str + str(node_ref.val)) |
| 38 | + for child_node in node_ref.next_list: |
| 39 | + dfs_detail(child_node, node_level + 1) |
| 40 | + |
| 41 | + dfs_detail(root_node, 0) |
| 42 | + |
| 43 | + max_len_incre_sub_arr_detail(0) |
| 44 | + max_val = max(map(lambda node: node.max_len, node_arr)) |
| 45 | + root_node = Node(-1) |
| 46 | + root_node.next_list = filter(lambda node: node.max_len == max_val, node_arr) |
| 47 | + print max_val |
| 48 | + print_tree(root_node) |
| 49 | + |
| 50 | + |
| 51 | +if __name__ == '__main__': |
| 52 | + max_len_incre_sub_arr([7, 2, 3, 1, 5, 8, 9, 6]) |
0 commit comments