1.
Description
给定一个矩形区域,每一个位置上都是1或0,求该矩阵中每一个位置上都是1的最大子矩形区域中的1的个数。
Input
输入的每一行是用空格隔开的0或1。
Output
输出一个数值。
Sample Input 1
1 0 1 1
1 1 1 1
1 1 1 0
Sample Output 1
6
import sys
class Solution:
def maximalRectangle(self, matrix):
"""
:n行,m列
:param matrix:
:return:
"""
n = len(matrix)
if n == 0:
return 0
m = len(matrix[0])
h = [0] * (m + 1)
self.ans = 0
for i in range(n):
for j in range(m):
if matrix[i][j] == '1':
h[j] += 1
else:
h[j] = 0
self.ans = self.robot(self.ans, h)
return self.ans
def robot(self, maxL, h):
stk = []
m = len(h) - 1
i = 0
while i <= m:
if len(stk) == 0 or h[stk[-1]] < h[i]:
stk.append(i)
i += 1
else:
now_idx = stk.pop()
if len(stk) == 0:
maxL = max(maxL, i * h[now_idx])
else:
maxL = max(maxL, (i - stk[-1] - 1) * h[now_idx])
return maxL
if __name__ == '__main__':
S= Solution()
strList = []
for line in sys.stdin: # 当没有接受到输入结束信号就一直遍历每一行,以换行加ctrl+D结束
tempStr = line.split() # 对字符串利用空字符进行切片
strList.append(tempStr)
#print(strList)
# print(len(strList))
#print(len(strList[0]))
# print(strList)
#temp =["1011","1111","1110"]
maxarea = S.maximalRectangle(strList)
print(maxarea)
2. 0-1矩阵,寻找最大正方形矩阵
#include<iostream>
using namespace std;
int main(){
int m;
int n;
cin>>m>>n;
int a[m][n];
for(int s=0;s<m;s++){
for(int h=0;h<n;h++){
cin>>a[s][h];
}
}
for(int s=0;s<m;s++){
for(int h=0;h<n;h++){
cout<<a[s][h]<<' ';
}
cout<<'\n';
}
/*
for(int s=0;s<m;s++){
for(int h=0;h<n;n++){
cin>>a[s][h];
}
}
*/
int max=-1;
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(a[i][j]==1){
int min=a[i-1][j-1];
if(a[i-1][j]<min)
min=a[i-1][j];
if(a[i][j-1]<min)
min=a[i][j-1];
a[i][j]+=min;
if(max<a[i][j])
max=a[i][j];
}
}
}
cout<<max<<endl;
}