本文主要是介绍golang最大子序和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题面
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
分析
- 比较老实的方法,计算所有可能的子序和,取最大值 O(M*N)
- 问题本质在于若干个子序和可能需要被重置,即确定重写的时机 这样只有O(N)
- 若上次求和值小于当前新进值且上次求和小于0,则sum 需要被置为新进程,后开始持续累加
实现
import "math"func maxSubArray(nums []int) int {max :=math.MinInt32 right,sum := 0,0for right=0;right<len(nums);right++ {if sum < nums[right] && sum <= 0{sum = nums[right]}else{sum +=nums[right]}if sum > max {max = sum}}if max == math.MinInt32 {return 0}return max
}
小结
- 实际是动态规则,计算求解过程中适时调整重置累加值
- 求最大最小必然有一次全遍历
- 尽可能的复用上一次计算结果,KMP算法的求前后缀最大公共子序长即为这一思想
- 合理设定重置条件
扩展
买卖股票最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
这篇关于golang最大子序和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!