最大子数组 && 最大子矩阵
2022/7/9 23:51:32
本文主要是介绍最大子数组 && 最大子矩阵,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
https://leetcode.cn/problems/maximum-subarray/
func maxSubArray(nums []int) int { maxAns:=-99999999999 len:=len(nums) ans:=0;begin:=0 le:=0;ri:=len-1 for i:=0;i<len;i++{ ans=ans+nums[i] if ans>=maxAns{ maxAns=ans le=begin ri=i } if ans<0{ ans=0 begin=i+1 } } fmt.Println(maxAns,le,ri) // tttt:=0 // for i:=le;i<=ri;i++{ // tttt=tttt+nums[i] // } return maxAns }
https://leetcode.cn/problems/max-submatrix-lcci/solution/zui-da-zi-ju-zhen-da-liang-tu-pian-zhu-s-cc13/
思路:
1、先求以列为维度的前缀和,preSum[i]表示第i列数据,长度为[bedinRow,endRow]的前缀和,endRow是递增的变量
2、在高为endRow-beginRow+1的矩阵中,最大矩阵和就是preSum最大子数组之和
func getMaxMatrix(matrix [][]int) []int{ row:=len(matrix);col:=len(matrix[0]) ans:=make([]int,4)//ans[0]和ans[1]分别表示左上角的坐标,ans[2]和ans[3]分表表示右下角的坐标 maxAns:=matrix[0][0] for beginRow:=0;beginRow<row;beginRow++{//先固定矩阵的开始行 preSum := make([]int,col) //保存的是按列为数组的前缀和,preSum[i]长度为[beginRow,endRow]的数组中,第i列的前缀和 for endRow:=beginRow;endRow<row;endRow++{//在固定矩阵结束行 nowAns:=-999999999;begin:=0 for i:=0;i<col;i++{//计算当前列数组的最大子数组和 preSum[i]=preSum[i]+matrix[endRow][i] //其实这里的变量是endRow,计算第i列,从beginRow到endRow的前缀和 if nowAns>0{ nowAns=nowAns+preSum[i] }else{ nowAns=preSum[i] begin=i } if maxAns<nowAns{ //维护最大子矩阵的坐标 ans[0]=beginRow ans[1]=begin ans[2]=endRow ans[3]=i maxAns=nowAns } } } } return ans }
这篇关于最大子数组 && 最大子矩阵的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23JAVA语音识别项目入门教程
- 2024-11-23Java云原生学习:从入门到实践
- 2024-11-22Java创业学习:初学者的全面指南
- 2024-11-22JAVA创业学习:零基础入门到实战应用教程
- 2024-11-22Java创业学习:从零开始的Java编程入门教程
- 2024-11-22Java对接阿里云智能语音服务学习教程
- 2024-11-22JAVA对接阿里云智能语音服务学习教程
- 2024-11-22Java对接阿里云智能语音服务学习教程
- 2024-11-22Java副业学习:零基础入门到实战项目
- 2024-11-22Java副业学习:零基础入门指南