1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
| package main
import ( "fmt" )
func maxSubArray(nums []int) int { if len(nums) == 0 { return 0 }
maxSum, curSum := nums[0], nums[0] for i := 1; i < len(nums); i ++ { curSum = max(curSum + nums[i], nums[i]) maxSum = max(maxSum, curSum) } return maxSum }
func maxSubArray_1(nums []int) int { res := int(-1e9) for _, x := range nums { res = max(res, x) } if res < 0 { return res }
t := build(nums, 0, len(nums) - 1) return t.ms }
type Node struct { ls int rs int ms int sum int }
func build(nums []int, l, r int) Node { if l == r { v := max(nums[l], 0) return Node{v, v, v, nums[l]} }
mid := (l + r) / 2 L := build(nums, l, mid) R := build(nums, mid + 1, r) res := Node{}
res.ls = max(L.ls, L.sum + R.ls) res.rs = max(R.rs, R.sum + L.rs) res.ms = max(max(L.ms, R.ms), L.rs + R.ls) res.sum = L.sum + R.sum return res }
func main() { testCases := []struct { nums []int expected int }{ {[]int{-2,1,-3,4,-1,2,1,-5,4}, 6}, {[]int{1}, 1}, {[]int{5,4,-1,7,8}, 23}, }
for i, tc := range testCases { fmt.Printf("Test Case %d, Input: nums = %v\n", i+1, tc.nums) result := maxSubArray(tc.nums)
if result == tc.expected { fmt.Printf("Test Case %d, Output: %d, PASS\n", i+1, result) } else { fmt.Printf("Test Case %d, Output: %d, FAIL (Expected: %d)\n", i+1, result, tc.expected) } } }
|