通用方法
后面的题没有处理数组或矩阵本身为空的情况,可以在开头判断一下长度,是0就直接return
模拟
第一题

顺时针一圈一圈的遍历,与左上角和右下角的坐标作比较,直到两坐标交错。
当leftUpRow、leftUpColumn、rightDownRow、rightDownColumn都相等时会剩中间一个中心元素时单独加if处理

第二题

不能直接遍历,遇到0就清零,这样会导致被清零的数也当成0,清零他的行列
所以先记录再清零
第三题


设置一个标志l2r,来控制从从左下到右上遍历还是从右上到左下遍历
每次横着或竖着改变坐标时,l2r就要变
从左下到右上遍历,就横坐标--,纵坐标++;
从右上到左下遍历,就横坐标++,纵坐标--;
但遇到四个边界时要单独控制移动方向
第四题

枚举法:
因为找最大正方形边长,所以从大到小枚举
先找N边长的矩形,再找N - 1,N - 2……
先找左上作为顶点,两层for
再找其他构成边的点 模拟各边遍历,进行检验
改进
即:预处理
记录每个元素,右边和下边,包括自己在内的连续的1的数量-->(右边,下面)
--------预处理后--------
其他步骤都一样
只有 “再找其他构成边的点 模拟各边遍历,进行检验” 这个进行改进
用左上角的顶点作为依据点
用她画边框进行检验
也就是取边框的几个顶点,利用对应点的预处理,组成边框的四条边,进行判断
java矩阵基础运算
有很多组合,比如
左上角的点右边的1的数目>=n
左上角的点下边的1的数目>=n
左下角的点右边的1的数目>=n
右上角的点下边的1的数目>=n
第五题
法一:暴力解法
模拟每一个子数组,进行累加,每增加一个元素,就和最大和作比较,进行更新
法二
遍历求和,如果求出来的和是负数,说明对后续累加出来的最大值没有贡献,则子数组的起点从他的下一个元素开始,每次都查看有没有贡献,没有就舍去
如果想知道最大和对应的子数组,就设两个指针,存子数组的开头结尾(索引)
第六题

利用第五题的思想
假设只有一行,就可以直接调用第五题的函数
如果有两行,就把两行加一起,再调用第五题的函数
如果有三行,同上
所以,核心思想:把矩阵处理成行向量,调用第五题的函数
设定一个基准行,把它后面的行,一行一行的累加,每加一行就调用第五题的函数,并更新maxSum,即可求出
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/1560.html