-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMicrosoft_Problem_07.py
42 lines (32 loc) · 1.23 KB
/
Microsoft_Problem_07.py
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
"""
This problem was asked by Microsoft.
Given an array of numbers, find the length of the longest increasing subsequence in the array. The subsequence does not necessarily have to be contiguous.
For example, given the array [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15], the longest increasing subsequence has length 6: it is 0, 2, 6, 9, 11, 15.
"""
cache = None
def get_subsequence(arr, start):
if start == len(arr):
return 0
current = arr[start]
length = 1
for index in range(start + 1, len(arr)):
if arr[index] >= current:
if index in cache:
count = cache[index]
else:
count = get_subsequence(arr, index) + 1
cache[index] = count
if count > length:
length = count
return length
def get_subsequence_helper(arr):
global cache
cache = dict()
return get_subsequence(arr, 0)
assert get_subsequence_helper([]) == 0
assert get_subsequence_helper([0, 1]) == 2
assert get_subsequence_helper([0, 2, 1]) == 2
assert get_subsequence_helper([0, 1, 2]) == 3
assert get_subsequence_helper([2, 1, 0]) == 1
assert get_subsequence_helper(
[0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]) == 6