LeetCode 第 224 场周赛 5655. Largest Submatrix With Rearrangements【动态规划】⭐⭐⭐⭐⭐

15 篇文章 0 订阅
13 篇文章 0 订阅

题目描述

在这里插入图片描述

知识点

动态规划

我的实现

码前思考

这道题目的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(mnlogn)
  • 空间复杂度: O ( n ) O(n) O(n)
    在这里插入图片描述

码后反思

比赛的时候忘记了LeetCode 85是怎么写的了。

参考文档

闫总的视频。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值