最大子数组问题-GoLang实现

来源:互联网 发布:vr眼镜评测 知乎 编辑:程序博客网 时间:2024/05/22 05:16

在一个数组A中寻找一个最大的子数组,这个问题可以用分治策略来求解。

首先需要划分问题,最大的子数组只有如下3中情况:

情况1:最大子序列出现在A[low]~A[mid]
情况2:最大子序列出现在A[mid+1]~A[high]
情况3:最大子序列包含A[mid],A[mid+1]

那么,问题的计算就可以分为对两个小的子序列求解,在加上一个复杂度为n的方法,那么整个问题的复杂度为nlgn


package maxSubArrimport(    "math")//FindMaximumSubArray 寻找最大子序列func FindMaximumSubArray(A []int, low, high int) (arrLow, arrHigh, arrSum int){    if low == high {        return low, high, A[low]    }        mid := (low + high) / 2        //只有3种情况    //情况1:最大子序列出现在A[low]~A[mid]    //情况2:最大子序列出现在A[mid+1]~A[high]    //情况3:最大子序列包含A[mid],A[mid+1]    leftLow, leftHigh, leftSum := FindMaximumSubArray(A, low, mid)    rightLow, rightHigh, rightSum := FindMaximumSubArray(A, mid + 1, high)    corssLow, corssHigh, corssSum := findMaximumCorssSubArray(A, low, mid, high)        if leftSum >= rightSum && leftSum >= corssSum {        return leftLow, leftHigh, leftSum    } else if rightSum >= leftSum && rightSum >= corssSum {        return rightLow, rightHigh, rightSum    }     return corssLow, corssHigh, corssSum}func findMaximumCorssSubArray(A []int, low, mid, high int) (arrLow, arrHigh, arrSum int) {    leftSum := math.MinInt64    sum := 0    for i := mid; i >= low; i-- {        sum = sum + A[i]        if sum > leftSum {            leftSum = sum            arrLow = i        }    }        rightSum := math.MinInt64    sum = 0        for i := mid + 1; i <= high; i++ {        sum = sum + A[i]        if sum > rightSum {            rightSum = sum            arrHigh = i        }    }        return arrLow, arrHigh, leftSum + rightSum}



0 0
原创粉丝点击