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


    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代码
    评论

  • 相关阅读:
    SDN大作业
    第06组 Beta版本演示
    SqlServer 将多行字段合并成单行
    C# MD5加密字符串
    Request.IsAjaxRequest()总是返回false
    Mybatis 语句包含单引号的写法
    idea每次启动maven项目都貌似读不到配置
    idea下springboot项目配置文件application.properties不生效的问题
    Ubuntu 设置时区
    SpringBoot 使用MyBatis
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14629748.html
Copyright © 2020-2023  润新知