2021-04-07:给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分,每一种方案都有,min{左部分累加和,右部分累加和},求这么多方案中,min{左部分累加和,...

福大大架构师每日一题 · · 97 次点击 · · 开始浏览    

2021-04-07:给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分,每一种方案都有,min{左部分累加和,右部分累加和},求这么多方案中,min{左部分累加和,右部分累加和}的最大值是多少? 整个过程要求时间复杂度O(N)。

福大大 答案2021-04-07:

自然智慧即可。
1.算出总累加和。
2.依次遍历,算出左累加和、右累加和。假设最小值是min。
3.当min大于ans时,保存min到ans中。
4.当左累加和大于右累加和时,退出循环。
5.返回ans。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
    arr := []int{1, 2, 3, 0, 0, 100, 1, 1}
    ret := bestSplit(arr)
    fmt.Println(ret)
}

func bestSplit(arr []int) int {
    if len(arr) < 2 {
        return 0
    }
    N := len(arr)
    sumAll := 0
    for i := 0; i < N; i++ {
        sumAll += arr[i]
    }
    ans := 0
    sumL := 0
    // [0...s]  [s+1...N-1]
    for s := 0; s < N-1; s++ {
        sumL += arr[s]
        sumR := sumAll - sumL
        ans = getMax(ans, getMin(sumL, sumR))
        if sumL > sumR {
            break
        }
    }
    return ans
}

func getMax(a int, b int) int {
    if a > b {
        return a
    } else {
        return b
    }
}

func getMin(a int, b int) int {
    if a < b {
        return a
    } else {
        return b
    }
}

执行结果如下:


在这里插入图片描述

左神java代码
评论


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

97 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传