【题目1】最大1矩阵
2014-10-20 01:51
155 查看
今天看到一道题目之后想起之前帮人补习算法的一道题目 【自己算法很水还帮人补习 orz 三天坑了他750】
下面那题是摘录leetcode题目的 电子书 里面13.4那题
今天看到的题目:
有一系列柱子
柱子高度分别为4 3 5 4 2 1
解法:
(1)矩阵必定是被某个高度限制列,例如长度为6也就是全部的长度,这个矩形就是被最后一个元素的高度限制住了
(2)我们枚举每一个高度,也就是枚举每一个元素,之后找出最长的长度 长乘以高就是面积
我们的关键就是找当前的高度a[i]的左右长度
动态规划:
如果当前a[i]>a[i-1],那么当前的高度不可以向左平移,左也就是0
如果当前a[i]<a[i-1],那么就要计算了,计算方法为,
过程中我们for a[i],
如果a[i]>a[i-1],L[i]=0,并且把元素a[i]压入一个栈,
如果a[i]<=a[i-1],我们把栈的元素弹出知道一个小于a[i]的数a[k],那么i-k就是a[i]可以向左平移的长度
同理计算R[] 之后过长找a[i]*(L[i]+1+R[i]) 的最大值
我们用栈来查找,
例如:
L[1]=0
L[2]=0
L[3]=0
L[4]=0
L[5]:
到第五个元素的时候把第四个弹出之后继续第三个弹出,第二个小于第五个不弹出 那么L[5]=5-3
题目:给出一个矩阵,m*n的矩阵,矩阵只有0和1元素,要求最大的1矩阵
【竟然是O(n*m)时间 差不多是扫面一遍的时间,实际扫面两遍】
------》
这个答案是8
跟上面有些重复的原理
(1)答案是一个矩形,那么我们可以证明,这个矩形的高是被一列的1元素限制的,例如样例就是被第二列第五列限制 不能再高一格,我们称为限制列 高度为H
(2)然后这个矩形的长度Length,限制列向左边平移的格子数量L(直到被一列高度跟限制列一样高但是里面有0元素的),限制列向右边平移的格子数量R(直到被一列高度跟限制列一样高但是里面有0元素的)Length=R+1+L
(3)当前限制列构造最大的矩形是(L+1+R)*H
上面是一个限制列的构造的矩阵的面试大小,每个限制列都有一个底,这个底就是矩阵的一个元素,我们枚举以每一个元素为底的限制列,计算该限制列的最大矩阵面积,这么多个(n*m)矩阵,其中最大的面积的矩阵就是最大1矩阵
如果我们把计算限制列高度限制列长度的时间降到O(1) 用动态规划实现 也就是动态规划得到H L R
代码之后附上,明天要早起,睡了先~
下面那题是摘录leetcode题目的 电子书 里面13.4那题
今天看到的题目:
有一系列柱子
柱子高度分别为4 3 5 4 2 1
解法:
(1)矩阵必定是被某个高度限制列,例如长度为6也就是全部的长度,这个矩形就是被最后一个元素的高度限制住了
(2)我们枚举每一个高度,也就是枚举每一个元素,之后找出最长的长度 长乘以高就是面积
我们的关键就是找当前的高度a[i]的左右长度
动态规划:
如果当前a[i]>a[i-1],那么当前的高度不可以向左平移,左也就是0
如果当前a[i]<a[i-1],那么就要计算了,计算方法为,
过程中我们for a[i],
如果a[i]>a[i-1],L[i]=0,并且把元素a[i]压入一个栈,
如果a[i]<=a[i-1],我们把栈的元素弹出知道一个小于a[i]的数a[k],那么i-k就是a[i]可以向左平移的长度
同理计算R[] 之后过长找a[i]*(L[i]+1+R[i]) 的最大值
我们用栈来查找,
例如:
L[1]=0
L[2]=0
L[3]=0
L[4]=0
L[5]:
到第五个元素的时候把第四个弹出之后继续第三个弹出,第二个小于第五个不弹出 那么L[5]=5-3
题目:给出一个矩阵,m*n的矩阵,矩阵只有0和1元素,要求最大的1矩阵
【竟然是O(n*m)时间 差不多是扫面一遍的时间,实际扫面两遍】
------》
这个答案是8
跟上面有些重复的原理
(1)答案是一个矩形,那么我们可以证明,这个矩形的高是被一列的1元素限制的,例如样例就是被第二列第五列限制 不能再高一格,我们称为限制列 高度为H
(2)然后这个矩形的长度Length,限制列向左边平移的格子数量L(直到被一列高度跟限制列一样高但是里面有0元素的),限制列向右边平移的格子数量R(直到被一列高度跟限制列一样高但是里面有0元素的)Length=R+1+L
(3)当前限制列构造最大的矩形是(L+1+R)*H
上面是一个限制列的构造的矩阵的面试大小,每个限制列都有一个底,这个底就是矩阵的一个元素,我们枚举以每一个元素为底的限制列,计算该限制列的最大矩阵面积,这么多个(n*m)矩阵,其中最大的面积的矩阵就是最大1矩阵
如果我们把计算限制列高度限制列长度的时间降到O(1) 用动态规划实现 也就是动态规划得到H L R
代码之后附上,明天要早起,睡了先~
相关文章推荐
- 题目:返回一个整型数组中最大子数组的和—第二部
- 题目1053:互换最大最小数
- HDOJ 题目2189 Swap(二分图最大匹配,输出路径)
- 满大街都是这种烂题目------从100亿个整数中找出最大的1000个整数
- NYOJ 题目448 寻找最大数
- HDU 4460 Friend Chains 第37届ACM/ICPC杭州赛区题目 (bfs求最短路,求两两之间最短路的最大值)
- [省选前题目整理][BZOJ 1565][NOI 2009]植物大战僵尸(最小割+最大权闭合子图建模)
- PAT练习基础编程题目之求自定类型元素的最大值
- NYOJ 题目587 blockhouses(二分图最大匹配)
- [省选前题目整理][BZOJ 1069][SCOI 2007]最大土地面积(旋转卡壳)
- 一道数组求连续子集最大值的题目。
- SPOJ 题目375 Query on a tree(link cut tree边权更新,求两点最大值)
- 编程之美2.3题目,寻找最大的发帖水王
- POJ 题目2485 Highways(最小生成树最大边)
- 题目1053:互换最大最小数
- 二分图最大匹配题目汇总 POJ 1274、2239、3020、3715
- 九度OJ; 题目1497:面积最大的全1子矩阵
- 题目1049: 最大公约数
- HDOJ 题目1281 棋盘游戏(二分图最大匹配,删边)
- 剑指Offer 题目1515:打印1到最大的N位数