九章算法面试题12 最大子区间/矩阵

来源:互联网 发布:新闻app源码 编辑:程序博客网 时间:2024/06/03 02:38

九章算法官网-原文网址

http://www.jiuzhang.com/problem/12/

题目

初阶:数组A中有N个数,需要找到A的最大子区间,使得区间内的数和最大。即找到0<=i<=j<N,使得A[i]+A[i+1] … + A[j]最大。A中元素有正有负。

进阶:矩阵A中有N*N个数,求A的最大的子矩阵。

解答

初阶:设Sum[i] = 前i个数的和,Min[i] = min{Sum[1], Sum[2] … Sum[i-1]}。从左到右枚举i,计算Sum[i]-Min[i]的最大值,即为答案。时间复杂度O(n),空间复杂度O(1),只需要在枚举的过程中记录一个Sum,一个Min和一个全局答案的Max即可。

进阶:枚举最大子矩阵的上下边界x和y,将第x行到第y行每一列的数叠加成为一个数。然后就成为了一个初阶的问题。时间复杂度O(n^3)。


面试官角度

初阶问题有若干种解法,上面给出的是枚举的方法。一种贪心的方法是,累加Sum的过程中,如果Sum<0,就让Sum=0(意味着之前的数不如不取,所以全部扔掉)。进阶的问题主要是考察是否能将其简化为初阶的问题来解决。其中进阶问题一般会考察程序实现,需要进行练习
0 0