前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2021-04-07:给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分

2021-04-07:给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分

原创
作者头像
福大大架构师每日一题
修改2021-04-08 11:21:45
3010
修改2021-04-08 11:21:45
举报

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编写。代码如下:

代码语言:txt
复制
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代码

评论

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com