美文网首页算法研究所
求连续最大子数组之和

求连续最大子数组之和

作者: 百里江山 | 来源:发表于2020-02-13 13:35 被阅读0次

一道面试题. 题目: 一维数组里有负数又有整数,求子数组连续求和最大.
如[1, 2, -4, 2, 3], 连续求和最大是[2,3],和: 2+3=5

共三种方法求解.

  1. 暴力求解 O(n^2), O(1)
  2. 动态规划 O(n), O(n)
  3. 动态规划(优化版本) O(n),O(1)

暴力求解

暴力法. 从0位置到尾都查看一遍,每计算一步都进行之前累加的数与当前数对比.并求出最大之和

//方法一: 暴力法. 从0位置到尾都查看一遍,每计算一步都进行之前累加的数与当前数对比.并求出最大之和
func ContinueChildArraySum(arr []int) int {
    total := 0//求得最终的和
    for i := 0; i < len(arr); i ++ {
        sum := 0 //当前连续之和
        for j := i; j < len(arr); j ++ { //从i到n之间寻找最大值.
            sum += arr[j] //累加
            fmt.Printf("sum:%d, total:%d, cur:%d\n", sum, total, arr[j])
            //比较三者之间大小, 取最大值.
            total = max3(total, sum, arr[j]) //三个元素中查找最大值.赋值给total变量.
        }
    }
    return total
}

动态规划

设置一个变量sum存储每一步的结果,如果当前值大于sum,则交换.
再定义一个dp数组,存储当前最大的元素.
时间O(n), 空间O(n)

//方法二: 动态规划
//设置一个变量sum存储每一步的结果,如果当前值大于sum,则交换.
//再定义一个dp数组,存储当前最大的元素.
//时间O(n), 空间O(n)
func ContinueChildArraySumDp(arr []int) int {
    dp := make([]int, len(arr)) //动态规划数组
    sum := 0 //当前步骤之和
    for i := 0; i < len(arr); i ++ {
        sum += arr[i] //累加操作.
        if sum < arr[i] { //当前大于sum,才交换
            sum = arr[i]
        }
        if sum > dp[i] { //如果大于DP值,则存储起来.
            dp[i] = sum
        }
    }
    max := 0 //查找dp数组,取出最大值.
    for i := 0; i < len(dp); i ++ {
        if dp[i] > max {
            max = dp[i]
        }
    }
    return max
}

动态规划(升级版本)

题目说, 有正有负, 连续之和必定大于0. 如果使用一个变量累加时,与当前元素还小则进行交换.
再重头计算.将每一次计算的结果存储在一个额外地变量里.最终得到最优解.

//方法三: 动态规划
//题目说, 有正有负, 连续之和必定大于0. 如果使用一个变量累加时,与当前元素还小则进行交换.
//再重头计算.将每一次计算的结果存储在一个额外地变量里.最终得到最优解.
func ContinueChildArraySumDpV2(arr []int) int {
    var total, sum = 0, 0 //定义一个total为最优解, sum为当前连续最优解的变量.
    for i := 0; i < len(arr); i ++ {
        sum += arr[i] //求连续最优解之和
        if arr[i] > sum { //如果当前值大于最优解则交换
            sum = arr[i] //交换
        }
        if sum > total { //如果最优解大于最终最优解则交换 .
            total = sum
        }
    }
    return total
}

完整代码与测试用例在github上. https://github.com/yezihack/algo/blob/leetcode/

相关文章

  • Leetcode-Medium 152. Maximum Pro

    题目描述 给定一个整数数组nums(有正有负),求最大子数组乘积 思路 求最大子数组乘积问题是求最大子数组之和演变...

  • 求连续最大子数组之和

    一道面试题. 题目: 一维数组里有负数又有整数,求子数组连续求和最大.如[1, 2, -4, 2, 3], 连续...

  • 动态规划

    求最大子数组,最大子乘积

  • 刷算法题:求一个序列的最大子序列之和!

    求一个序列的最大子序列之和! 不是求最大子序列之和嘛!我脑子居然就一直关注到了最大子序列上去了,导致我想着实现代码...

  • LeetCode #1191 K-Concatenation M

    1191 K-Concatenation Maximum Sum K 次串联后最大子数组之和 Descriptio...

  • 最大子数组之和

    问题: 输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组。 描述: 输入的数组为1...

  • 最长子序列问题

    最大子序列最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5...

  • 53. 最大子序和

    题目链接: 53. 最大子序和 题目描述: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最...

  • 1-1 算法 - 最大连续子数组和

    一、 问题描述   给出一个一维数组,数组中的数有正有负,求该数组中连续元素之和最大值 二、暴力法 2.1 解题思...

  • #常见面试算法题

    阅读目录 *求数组最大连续子序列之和 1.求数组最大连续子序列之和 一个有N个元素的整型数组arr,有正有负,数组...

网友评论

    本文标题:求连续最大子数组之和

    本文链接:https://www.haomeiwen.com/subject/kdwkfhtx.html