A = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7}
function find_max_crossing_subappay(A, low, mid, high)
local left_sum = nil
local sum = 0
local max_left = -1
for i = mid, low, -1 do
sum = sum + A[i]
if not left_sum or sum > left_sum then
left_sum = sum
max_left = i
end
end
local right_sum = nil
sum = 0
local max_right = -1
for j = mid + 1, high do
sum = sum + A[j]
if not right_sum or sum > right_sum then
right_sum = sum
max_right = j
end
end
return max_left, max_right, left_sum + right_sum
end
function find_maximum_subarray(A, low, high)
if high == low then return low, high, A[low]
else
local mid = math.floor((low + high) / 2)
local left_low, left_high, left_sum = find_maximum_subarray(A, low, mid)
local right_low, right_high, right_sum = find_maximum_subarray(A, mid + 1, high)
local cross_low, cross_high, cross_sum = find_max_crossing_subappay(A, low, mid, high)
if left_sum >= right_sum and left_sum >= cross_sum then
return left_low, left_high, left_sum
elseif right_sum >= left_sum and right_sum >= cross_sum then
return right_low, right_high, right_sum
else
return cross_low, cross_high, cross_sum
end
end
end
print(find_maximum_subarray(A,1,#A))
从零开始读算法导论第三版 求最大子数组和 LUA实现
最新推荐文章于 2021-11-02 17:42:44 发布