求数组连续求和最大值

题目:给出一个指定整形数组,求从数组某下标开始连续求和的”最大值“,并给出”起始“及”结束“的下标
:给定数组[-1,8,-6,7,-10,-3,3,2] 那么连续求和最大值是7,开始下标是1、结束是3,即是[8,-6,7]的和。

思路:

从数组起始位置向后遍历,抛弃和为负数的子数组,加上和为正数的子数组。(想象一个滑动窗口不停向右移动)

代码:

type Response struct {
    Start  int
    End    int
    MaxSum int
}

func CaculateMaxSum(numlist []int) Response {
    switch len(numlist) {
    case 0:
        return Response{-1, -1, 0}
    case 1:
        return Response{0, 0, numlist[0]}
    default:

    }
    sum := numlist[0]
    sumToCurrent := numlist[0]
    start, end := 0, 0
    for index, num := range numlist {
        //abando negative sum
        if sum < 0 && num > sum {
            start, end, sum = index, index, num
            sumToCurrent = num
        } else if sum > 0 && (sumToCurrent-sum)+num > 0 {
            //sum the  current  value
            start, end, sum = start, index, sumToCurrent+num
            sumToCurrent = sum
        } else {
            //update sumToCurrent
            sumToCurrent = sumToCurrent + num
        }

    }

    return Response{start, end, sum}
}


func TestCaculateMaxSum(t *testing.T){
    testlist := [][]int{
        []int{-1, 8, -7, 6, -10, -3, 3, 2},
        []int{-8, -7, -6, -10, -3, -5},
        []int{-8, -7, 6, -1, -3, 5},
    }

    for _, numlist := range testlist {
        rsp := CaculateMaxSum(numlist)
        t.Logf("start:%v, end:%v, sum:%v\n", rsp.Start, rsp.End, rsp.MaxSum)
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,465评论 0 5
  • 数组创建 JavaScript中创建数组有两种方式,第一种是使用 Array 构造函数: vararr1 = ne...
    刘松阳阅读 269评论 0 0
  • JavaScript中创建数组有两种方式,第一种是使用 Array 构造函数: vararr1 = newArra...
    寄鱼予海与你阅读 529评论 0 0
  • DAY 01 JAVA简述 Java是由SUN公司在1995年推出的一门高级编程语言,是现今服务器端的首选编程语言...
    周书达阅读 1,019评论 0 0
  • JavaScript中创建数组有两种方式 (一)使用 Array 构造函数: var arr1 = new Arr...
    landry阅读 153评论 0 0