题目描述
知识点
动态规划
我的实现
码前思考
这道题目的motivation跟LeetCode 85非常像,是它的一个简化版。
在LeetCode 85中,我们利用分解问题的方法,提出最大子矩阵一定是以某一行为底的思想对问题进行分解(这是代码的第一层循环)。
在LeetCode 85中,我们需要使用到单调栈,但是在这道题目中,由于列是可以移动的,所以我们直接“贪心”地对高度进行排序,这样就能够保证充分利用列可移动的条件得到以当前列为高的最大面积。
代码实现
//leetcode 85的简化版本,不需要用到单调栈,直接排序即可
class Solution {
public:
int largestSubmatrix(vector<vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
int maxArea = 0;
//得到长度数组
vector<int> height(n,0);
for(int i=0;i<m;i++){
//首先遍历得到高度
for(int j=0;j<n;j++){
if(matrix[i][j]==1){
height[j]+=1;
}else{
height[j]=0;
}
}
//将高度赋值到排序数组
vector<int> sort_vt;
sort_vt = height;
sort(sort_vt.begin(),sort_vt.end());//从小到大排序
//从右到左遍历
for(int j=n-1;j>=0;j--){
maxArea = max(maxArea,(n-j)*sort_vt[j]);
}
}
return maxArea;
}
};
时空复杂度分析
- 时间复杂度: O ( m ∗ n l o g n ) O(m*nlogn) O(m∗nlogn)
- 空间复杂度:
O
(
n
)
O(n)
O(n)
码后反思
比赛的时候忘记了LeetCode 85是怎么写的了。
参考文档
闫总的视频。