美文网首页
Maximum Subarray. Divide & C

Maximum Subarray. Divide & C

作者: R0b1n_L33 | 来源:发表于2017-09-20 17:26 被阅读7次
    ///Maximum Subarray. Divide & Conquer.  Θ(nlgn)
    func maximumSubarray(_ array: [Int]) throws -> (Int, Int, Int) {
        return try _maximumSubarray(array, low: 0, high: array.count-1)
    }
    
    func _maximumSubarray(_ array: [Int], low:Int, high:Int) throws -> (Int, Int, Int) {
        //low>=0 NOT low>0
        guard low<=high, low>=0 else { throw TestError.argumentFault }
        if low == high { return (low, high, array[low]) }
        let mid = (low+high)/2
        let pre = try _maximumSubarray(array, low: low, high: mid)
        let post = try _maximumSubarray(array, low: mid+1, high: high)
        let cross = try crossSubarray(array, low: low, mid: mid, high: high)
        if pre.2>=post.2, pre.2>=cross.2 { return pre }
        if post.2>=pre.2, post.2>=cross.2 { return post }
        return cross
    }
    
    func crossSubarray(_ array:[Int], low:Int, mid:Int, high:Int) throws ->(Int, Int, Int) {
        //low>=0 NOT low>0
        guard low<=mid, mid<=high, low>=0 else { throw TestError.argumentFault }
        var maxLeft = Int.min, maxRight = Int.min, sum = 0, left = 0, right = 0
        for i in (low...mid).reversed() {
            sum += array[i]
            if sum > maxLeft {
                maxLeft = sum
                left = i
            }
        }
        sum = 0
        //Start from mid+1 NOT mid
        for i in mid+1...high {
            sum += array[i]
            if sum > maxRight {
                maxRight = sum
                right = i
            }
        }
        return (left, right, maxLeft+maxRight)
    }
    
    var s = try Int.randomArray(above: -10, under: 10)
    try maximumSubarray(s)
    

    相关文章

      网友评论

          本文标题:Maximum Subarray. Divide & C

          本文链接:https://www.haomeiwen.com/subject/ptiosxtx.html