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