def maximum_circular_subarray(arr):
max_subarray_sum_wraparound = sum(arr) - min_subarray_sum(arr)
return max(max_subarray_sum(arr), max_subarray_sum_wraparound)
def max_subarray_sum(arr):
max_ending_here = max_so_far = 0
for x in arr:
max_ending_here = max(x, max_ending_here + x)
max_so_far = max(max_so_far, max_ending_here)
return max_so_far
def min_subarray_sum(arr):
min_ending_here = min_so_far = 0
for x in arr:
min_ending_here = min(x, min_ending_here + x)
min_so_far = min(min_so_far, min_ending_here)
return min_so_far
μ°μμ μΌλ‘ μ΄λ£¨μ΄μ§ subArray μ€ κ°μ₯ μμ κ°μ κ°μ§ λΆλΆμ λ λ € λ²λ¦¬λ©΄?
[5, -1, -2, -5, -1, 6]
// max sub array
[5, 4, 2, -3, -1, 6]
6 μ΄ κ°μ₯ ν° sub array sum μ΄λ€
κ°μ΄ 0 μΌλ‘ λ¨μ΄μ§κΈ° μ μλ μ°μνλ current Sum μ ꡬν΄μ£Όκ³
κ°μ΄ 0 μ΄νλ‘ λ¨μ΄μ§ μ΄νμ
// min sub array
[0, -1, -3, -8, -9, -3]
-9 μ΄ μλ―Ένλ λ°λ [-1, -2, -5, -1] μ ν©μ΄κ³ μ΄ sub arrayκ° μ΄ λ°°μ΄μμ κ°μ₯ μμ ν©μ νμ±νλ€.
-9 κ° μμμ΄κΈ° λλ¬Έμ μ΄ κ°μ total sumμμ λΉΌλ©΄
2 - (-9) = 11 λ‘ μ΅λ κ°μ κ°μ§λ circular sub array [6] -> [5]λ₯Ό ꡬν μ μλ€.
// extra
-9 κ° μλλΌ 1 μ΄λ©΄
2 - 1 = 1 μ΄κΈ° λλ¬Έμ μ΄ κ°μ΄ μ΅λ sub array ν©μ΄ μλ μ μλ€.
κ·Έλμ κ·Έκ²μ νμΈνκΈ° μν΄
max_subarray_sum_wraparound = sum(arr) - min_subarray_sum(arr)
max(max_subarray_sum(arr), max_subarray_sum_wraparound)
max (max_subarray_sum, total - μ΅μ ν©μ λνλ΄λ κ΅¬κ° sub array)
μΌλ‘ λ§μ§λ§ λ³μλ₯Ό μ²΄ν¬ νλ€
μ΅μ ν©μ λνλ΄λ κ΅¬κ° sub array => μμμΌ κ²½μ° νμΈ μ©