import unittest
def max_subarray_sum(arr):
«»»Kadane’s algorithm: returns the maximum sum of a contiguous subarray.
If the array is empty‚ returns 0.
«»»
if not arr:
return 0
max_current = max_global = arr[0]
for num in arr[1:]:
max_current = max(num‚ max_current + num)
if max_current > max_global:
max_global = max_current
return max_global
class TestMaxSubarraySum(unittest.TestCase):
def test_positive_numbers(self):
self.assertEqual(max_subarray_sum([1‚ 2‚ 3‚ 4])‚ 10)
self.assertEqual(max_subarray_sum([5‚ 1‚ 3])‚ 9)
def test_negative_numbers(self):
self.assertEqual(max_subarray_sum([-1‚ -2‚ -3])‚ -1)
self.assertEqual(max_subarray_sum([-5‚ -2‚ -3])‚ -2)
def test_mixed_numbers(self):
self.assertEqual(max_subarray_sum([-2‚ 1‚ -3‚ 4‚ -1‚ 2‚ 1‚ -5‚ 4])‚ 6)
self.assertEqual(max_subarray_sum([2‚ -1‚ 2‚ 3‚ 4‚ -5‚ 1])‚ 10)
def test_empty_array(self):
self.assertEqual(max_subarray_sum([])‚ 0)
def test_single_element(self):
self.assertEqual(max_subarray_sum([5])‚ 5)
self.assertEqual(max_subarray_sum([-3])‚ -3)
def test_all_negative_except_one_zero(self):
self.assertEqual(max_subarray_sum([-2‚ -1‚ 0‚ -3])‚ 0)
def test_large_array(self):
arr = list(range(-1000‚ 1000))
# The maximum subarray sum is sum of 0 to 999 = 999*1000/2 = 499500
self.assertEqual(max_subarray_sum(arr)‚ 499500)
if __name__ == ‘__main__’:
unittest.main