forked from colonelpanic/dotfiles
max_double_slice.py
This commit is contained in:
parent
ec2927800d
commit
1d32ee047d
51
dotfiles/lib/python/max_double_slice.py
Normal file
51
dotfiles/lib/python/max_double_slice.py
Normal file
@ -0,0 +1,51 @@
|
||||
class Result(object):
|
||||
|
||||
def __init__(self, lb, excluded, rb, max):
|
||||
self.lb = lb
|
||||
self.excluded = excluded
|
||||
self.rb = rb
|
||||
self.max = max
|
||||
|
||||
def __repr__(self):
|
||||
return "left bound: {0}, excluded {1}, right_bound {2}, max {3}".format(
|
||||
self.lb,
|
||||
self.excluded,
|
||||
self.rb,
|
||||
self.max,
|
||||
)
|
||||
|
||||
|
||||
|
||||
def max_double_slice(array):
|
||||
left_slices = max_slice_at_index(array)
|
||||
right_slices = max_slice_at_index(array[::-1])[::-1]
|
||||
print left_slices
|
||||
print right_slices
|
||||
def slice_sum(index):
|
||||
left_contribution = left_slices[index - 1][-1] if index > 0 else 0
|
||||
right_contribution = right_slices[index + 1][-1] if index < len(array) - 2 else 0
|
||||
return right_contribution + left_contribution
|
||||
maximizing_slice_index = max((i for i in range(len(array))), key=slice_sum)
|
||||
left_bound, lmax = left_slices[maximizing_slice_index - 1] if maximizing_slice_index > 0 else (0, 0)
|
||||
rs, rmax = right_slices[maximizing_slice_index + 1] if maximizing_slice_index < len(array) - 2 else (len(array) - 1, 0)
|
||||
right_bound = len(array) - 1 - rs
|
||||
return Result(left_bound, maximizing_slice_index, right_bound, lmax + rmax)
|
||||
|
||||
|
||||
def max_double_slice_value(array):
|
||||
left, right = max_double_slice(array)
|
||||
return left[-1] + right[-1]
|
||||
|
||||
|
||||
def max_slice_at_index(array):
|
||||
max_at_index = []
|
||||
for index, array_value in enumerate(array):
|
||||
last_start, last_max = max_at_index[-1] if max_at_index else (index, 0)
|
||||
if last_max < 0:
|
||||
current_max = array_value
|
||||
current_start = index
|
||||
else:
|
||||
current_max = array_value + last_max
|
||||
current_start = last_start
|
||||
max_at_index.append((current_start, current_max))
|
||||
return max_at_index
|
Loading…
Reference in New Issue
Block a user