• N元数组的子数组之和的最大值


    题目:有N个整数的元素的一维数组,求子数组中元素之和中最大的一组(思想:动态规划)

    分析:

       设该数组为array[N], 那么对于array[i]该不该在元素之和最大的那个子数组中呢?首先,不如假设array[0..i-1]这个子数组的元素之和最大的子数组已求出,且和为Max,起始编号为start,结束编号为end, temp[i] 记录将array[i]强制加入到array[0..i-1]的元素之和最大的子数组中(比如数组:1, -3] 则temp[2] = -2, 虽然1才是最大和Max);

      如果array[i]加入到array[0..i-1]的元素和最大的子数组中,那么必须:

        temp[i - 1] + array[i] > Max; 确定只有着一个条件么? 非也,如果array[i] > temp[i - 1] + array[i] > Max呢(即Max<0)?这个时候,整个array[0..i]元素组成的子数组中最大和应该变为新的array[i]的值, 且start的新的值为i, end也为i,且temp[i] = array[i];

      如果temp[i-1] + array[i] < Max, 这说明array[i]是一个负数,那么array[0..i]元素组成的子数组中和最大仍未Max, 且start, end都为变化;

      根据上述思想,依次求得array[0..i](i=0, 1, 2...N)的子数组的子数组元素最大和对应的问题结果, 

    例子:

      如s[6] = {3, -6, 8, 7, -2, 5}, 首先

      对于3:    start = end = 0; Max = 3; temp[0] = 3

      3, -6:     temp[0] + array[1] =  -3 < Max,  此时start = end = 0; Max = 3; temp[1] = temp[0] + array[1] = -3

      3, -6, 8:   Max < temp[1] + array[2] = 5  < array[2],  此时start = end = 2; Max = 8; 由于start的值发生了变化, 此时temp[2]应作新的处理,即temp[2] = array[2] = 8;

      3, -6, 8, 7:  Max < temp[2] + array[3] = 15,  此时start = 2, end  = 3,  temp[3] =  temp[2] + array[3]= 15; Max = 15,

      3, -6, 8, 7, -2:  temp[3] + array[4] < Max, 此时start =2, end = 3, Max = 15(三者不变), temp[4] = temp[3]+ array[4] = 13

      3, -6, 8, 7, -2, 5:  Max < temp[4] + array[5], 此时start = 2(不变) end+=1,即end=5, temp[5] = temp[4] + array[5] = 18 结束

    代码(golang):

    package main
    import (
        "fmt"
    )
    func main() {
        array := []int{3, -6, 8, 7, -2, 5}
        lenth := len(array);
        start, end := 0, 0
        var t int
        Max := array[start]
        temp := make([]int, lenth)
        for i := 1; i < lenth; i++ {
            t = array[i] + temp[i - 1] 
            if t <= array[i] {
                start = i
                end = i
                temp[i] = array[i]
                Max = array[i]
            } else {
                if t > Max {
                    end = i
                    Max = t
                }
                temp[i] = t
            }
        }
        fmt.Println("Max subarray's sum: ", Max, " from ", start, "to ", end)
    }
  • 相关阅读:
    LevelDB
    Erlang的gen_server的terminate()/2未执行
    集群间心跳检测
    AI从业者关于数学的一些小建议
    《百面机器学习》拾贝----第三章:经典算法
    Demo——Image classification
    《百面机器学习》拾贝----第二章:模型评估
    《百面机器学习》拾贝----第一章:特征工程
    算法工程师---职业生涯规划
    License Plate Detection and Recognition in Unconstrained Scenarios(无约束场景下的车牌检测与识别)
  • 原文地址:https://www.cnblogs.com/Sunlnx/p/3327063.html
Copyright © 2020-2023  润新知