昨天晚上是一种暴利解法求解子数组的累加和,下面是另一种解法以及其它变体
思路2:单向扫描求和,如果是累加和为负数则丢弃,
正数的时候则继续,最后返回max,,, //这个思路可以记住
findSum2(int arr[])//算法的复杂度为On
sum=arr[0]
max=sum
int left=0,right=0
for(i=1;i<length;i++)
if (sum>=0)
sum+=arr[i]
else
sum=arr[i]//重新定义新的起点位置
left=i
if(sum>max)
max=sum
right=j //更新max的时候更新right
return max;
求子矩阵的最大累加和
思路不提倡暴利解法因为暴利解法会造成复杂度是n的4次方
用思路2:对于每一行首元素可以单独进行累加求和,
有3+2+1个划分。所以有N的平方,每个划分利用列求和的方法在查找最大和可以
利用上面的n的复杂度求和,所以总共是n的3次方。
伪代码如下:
finsumMax(int[][]maxtrix)
sumi=maxtrix[0][0]
for i =0;i<n;i++
max =0
maxi=findsum2(maxtrix[i])
if maxi>0
max+=maxi
maxSum(int[][]mat)
int beginRow=0 //起始行
int M=mat.length 行的长度
int N=mat[0].length 列的长度
int []sums=new int[N] 按列求和
int max=0 历史最大的子矩阵的和
while(biginRow<M)
for(int i=beginRow;i<M;i++)从起始行到第i行
按列累加
for(j=0;j<N;j++)
sums[j]+=max[i][j]
累加完成求出最大和子数组
int t = findSum2(sums)
if(t>max)
max=t;
Arrays.fill(sums,0)
beginRow++;
return max;
上面算法三层循环,第三层里面是两个n+n=2n所以还是On的级别
所以上面的复杂度为N的三次方
本文探讨了两种高效算法解决子数组累加和问题:单向扫描和矩阵分解。单向扫描法通过判断累加和是否为负,优化求解过程。针对二维矩阵,通过先按行求和再找最大子和,将复杂度降低至O(n^3)。
16

被折叠的 条评论
为什么被折叠?



