题意:
给你一个二进制矩阵 matrix ,它的大小为 m x n ,你可以将 matrix 中的 列 按任意顺序重新排列。
请你返回最优方案下将 matrix 重新排列后,全是 1 的子矩阵面积。
数据范围:
m == matrix. length
n == matrix[ i] . length
1 <= m * n <= 1e5
matrix[ i] [ j] 要么是 0 ,要么是 1 。
解法:
令h[ i] [ j] 为对于第i行第j列, 向上的全1 高度,
用temp数组装入h[ i] [ ] , 从大到小排序,
然后从左到右遍历计算所有矩形面积取max即可.
复杂度O ( n* m* log ( m) )
code:
class Solution {
public :
int largestSubmatrix ( vector< vector< int >> & a) {
int n= a. size ( ) ;
int m= a[ 0 ] . size ( ) ;
vector< int > h ( m+ 5 , 0 ) ;
int ans= 0 ;
vector< int > temp;
for ( int i= 0 ; i< n; i++ ) {
for ( int j= 0 ; j< m; j++ ) {
if ( a[ i] [ j] == 0 ) h[ j] = 0 ;
else h[ j] ++ ;
}
temp. clear ( ) ;
for ( int j= 0 ; j< m; j++ ) {
temp. push_back ( h[ j] ) ;
}
sort ( temp. begin ( ) , temp. end ( ) , [ ] ( int a, int b) { return a> b; } ) ;
int mi= temp[ 0 ] ;
for ( int j= 0 ; j< m; j++ ) {
if ( ! temp[ j] ) break ;
mi= min ( mi, temp[ j] ) ;
ans= max ( ans, ( j+ 1 ) * mi) ;
}
}
return ans;
}
} ;