Skip to content

Commit f481f54

Browse files
committed
finish max sum sub arr
1 parent d72b272 commit f481f54

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import numpy as np
2+
3+
4+
def inclusive_scan(num_list):
5+
ret_list = []
6+
sum_val = 0
7+
for num in num_list:
8+
sum_val += num
9+
ret_list.append(sum_val)
10+
return ret_list
11+
12+
13+
# inclusive i, j
14+
def min_max(i, j, num_list):
15+
assert 0 <= i <= j <= len(num_list)
16+
min_idx, max_idx = i, i
17+
min_val, max_val = num_list[i], num_list[i]
18+
for idx in xrange(i + 1, j + 1):
19+
if min_val > num_list[idx]:
20+
min_idx, min_val = idx, num_list[idx]
21+
if max_val < num_list[idx]:
22+
max_idx, max_val = idx, num_list[idx]
23+
return min_idx, max_idx
24+
25+
26+
def max_difference(i, j, num_list):
27+
# condition
28+
if i > j:
29+
return -1, -1, -np.inf
30+
else:
31+
min_idx, max_idx = min_max(i, j, num_list)
32+
if min_idx <= max_idx:
33+
return min_idx, max_idx, num_list[max_idx] - num_list[min_idx]
34+
else:
35+
cur_min_idx, cur_max_idx = min_max(i, max_idx, num_list)
36+
cur_max_differ = num_list[cur_max_idx] - num_list[cur_min_idx]
37+
38+
new_min_idx, new_max_idx = min_max(min_idx, j, num_list)
39+
new_max_differ = num_list[new_max_idx] - num_list[new_max_idx]
40+
41+
if new_max_differ > cur_max_differ:
42+
cur_min_idx, cur_max_idx = new_min_idx, new_max_idx
43+
44+
middle_min_idx, middle_max_idx, middle_max_differ = max_difference(max_idx + 1, min_idx - 1, num_list)
45+
if middle_max_differ > cur_max_differ:
46+
cur_min_idx, cur_max_idx, cur_max_differ = middle_min_idx, middle_max_idx, middle_max_differ
47+
48+
return cur_min_idx, cur_max_idx, cur_max_differ
49+
50+
51+
if __name__ == '__main__':
52+
input_list = [1, -2, 3, 10, -4, 7, 2, -5]
53+
scan_list = inclusive_scan(input_list)
54+
print input_list
55+
print scan_list
56+
print max_difference(0, len(scan_list) - 1, scan_list)
57+
58+
scan_list1 = [2, 4, 7, -1, 3, 6, -2, 4]
59+
print max_difference(0, len(scan_list1)-1, scan_list1)

0 commit comments

Comments
 (0)