minimum subarray:: O(N), O(1)

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

min_subArray_sum

μ—°μ†μ μœΌλ‘œ 이루어진 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 => 음수일 경우 확인 용

Last updated