排序题目:重新排列后的最大子矩阵

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:重新排列后的最大子矩阵

出处:1727. 重新排列后的最大子矩阵

难度

7 级

题目描述

要求

给定一个大小为 m × n \texttt{m} \times \texttt{n} m×n 的二进制矩阵 matrix \texttt{matrix} matrix,可以将 matrix \texttt{matrix} matrix 中的按任意顺序重新排列。

返回将 matrix \texttt{matrix} matrix 按照最优方案重新排列后,全是 1 \texttt{1} 1 的最大子矩阵面积。

示例

示例 1:

示例 1

输入: matrix   =   [[0,0,1],[1,1,1],[1,0,1]] \texttt{matrix = [[0,0,1],[1,1,1],[1,0,1]]} matrix = [[0,0,1],[1,1,1],[1,0,1]]
输出: 4 \texttt{4} 4
解释:可以按照上图方式重新排列矩阵的每一列。最大的全 1 \texttt{1} 1 子矩阵是上图中加粗的部分,面积为 4 \texttt{4} 4

示例 2:

示例 2

输入: matrix   =   [[1,0,1,0,1]] \texttt{matrix = [[1,0,1,0,1]]} matrix = [[1,0,1,0,1]]
输出: 3 \texttt{3} 3
解释:可以按照上图方式重新排列矩阵的每一列。最大的全 1 \texttt{1} 1 子矩阵是上图中加粗的部分,面积为 3 \texttt{3} 3

示例 3:

输入: matrix   =   [[1,1,0],[1,0,1]] \texttt{matrix = [[1,1,0],[1,0,1]]} matrix = [[1,1,0],[1,0,1]]
输出: 2 \texttt{2} 2
解释:由于只能按整列重新排布,所以没有比面积为 2 \texttt{2} 2 更大的全 1 \texttt{1} 1 子矩形。

数据范围

  • m = matrix.length \texttt{m} = \texttt{matrix.length} m=matrix.length
  • n = matrix[i].length \texttt{n} = \texttt{matrix[i].length} n=matrix[i].length
  • 1 ≤ m × n ≤ 10 5 \texttt{1} \le \texttt{m} \times \texttt{n} \le \texttt{10}^\texttt{5} 1m×n105
  • matrix[i][j] \texttt{matrix[i][j]} matrix[i][j] 0 \texttt{0} 0 1 \texttt{1} 1

解法

思路和算法

由于对矩阵重新排列的规则是按整列重新排列,因此可以对矩阵的每一列做预处理,对于每个元素 1 1 1,计算该元素向上的最大连续 1 1 1 的个数,然后即可单独处理矩阵的每一行。

经过预处理之后,矩阵中的每个元素更新为该元素向上的最大连续 1 1 1 的个数。如果更新后的矩阵中,某一行有 x x x 个元素不小于 y y y x x x y y y 都是正整数),则说明可以将原矩阵重新排列,使得重新排列的矩阵中存在一个以该行为底边的全 1 1 1 子矩阵,该子矩阵的宽度是 x x x,高度是 y y y,面积是 x y xy xy

为了得到最大全 1 1 1 子矩阵的面积,可以将更新后的矩阵的每一行排序,然后对矩阵的每一行按照从大到小的顺序遍历,计算以该行为底边的最大全 1 1 1 子矩阵面积。

对于矩阵的某一行,假设第 k k k 大的元素是 val k \textit{val}_k valk k ≥ 1 k \ge 1 k1),则该行有至少 k k k 个元素不小于 val k \textit{val}_k valk k k k 个最大元素组成的全 1 1 1 子矩阵面积是 val k × k \textit{val}_k \times k valk×k。从大到小遍历该行的每个元素,当元素大于 0 0 0 时使用元素值与元素的排序编号(第 k k k 大的元素的排序编号是 k k k)计算全 1 1 1 子矩阵面积,并维护最大全 1 1 1 子矩阵面积。当遍历到等于 0 0 0 的元素时,该行剩余的元素都是 0 0 0,该行内不可能再遇到全 1 1 1 子矩阵,因此结束遍历该行。

遍历更新后的矩阵的每一行之后,即可得到最大全 1 1 1 子矩阵面积。

代码

class Solution {
    public int largestSubmatrix(int[][] matrix) {
        int maxArea = 0;
        int m = matrix.length, n = matrix[0].length;
        for (int i = 1; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 1) {
                    matrix[i][j] = matrix[i - 1][j] + 1;
                }
            }
        }
        for (int i = 0; i < m; i++) {
            int[] row = matrix[i];
            Arrays.sort(row);
            for (int j = n - 1, k = 1; j >= 0 && row[j] > 0; j--, k++) {
                int area = row[j] * k;
                maxArea = Math.max(maxArea, area);
            }
        }
        return maxArea;
    }
}

复杂度分析

  • 时间复杂度: O ( m n log ⁡ n ) O(mn \log n) O(mnlogn),其中 m m m n n n 分别是矩阵 matrix \textit{matrix} matrix 的行数和列数。遍历并更新矩阵需要 O ( m n ) O(mn) O(mn) 的时间,对更新后的矩阵的每一行排序共需要 O ( m n log ⁡ n ) O(mn \log n) O(mnlogn) 的时间,计算最大面积需要 O ( m n ) O(mn) O(mn) 的时间,时间复杂度是 O ( m n log ⁡ n ) O(mn \log n) O(mnlogn)

  • 空间复杂度: O ( log ⁡ n ) O(\log n) O(logn),其中 n n n 是矩阵 matrix \textit{matrix} matrix 的列数。对更新后的矩阵的每一行排序需要 O ( log ⁡ n ) O(\log n) O(logn) 的递归调用栈空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/885239.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

可以白嫖PPT模板的6个网站,赶紧收藏

推荐6个PPT模板网站&#xff0c;免费下载&#xff0c;绝对的高质量&#xff0c;赶紧收藏&#xff01; 1、菜鸟图库 ppt模板免费下载|ppt背景图片 - 菜鸟图库 菜鸟图库网有非常丰富的免费素材&#xff0c;像设计类、办公类、自媒体类等素材都很丰富。PPT模板种类很多&#xff0…

Python和MATLAB库尔巴克–莱布勒散度信息论统计学生物学和算法模型

&#x1f3af;要点 高斯混合模型聚类和t分布随机邻域嵌入底层分析信息论测量复合彩票统计学计算结果离散分布速率最优估计器样本统计相似性快速闭环散度和交叉熵计算催乳素诱导模型贝叶斯快速推理模型视觉皮层活动神经数据分布 Python散度 在数理统计中&#xff0c;库尔巴克…

Gson将对象转换为JSON(学习笔记)

JSON有两种表示结构&#xff0c;对象和数组。对象结构以"{"大括号开始&#xff0c;以"}"大括号结束。中间部分由0或多个以”&#xff0c;"分隔的”key(关键字)/value(值)"对构成&#xff0c;关键字和值之间以":"分隔&#xff0c;语法结…

PHP程序如何实现限制一台电脑登录?

PHP程序如何实现限制一台电脑登录&#xff1f; 可以使用以下几种方法&#xff1a; 1. IP地址限制&#xff1a;在PHP中&#xff0c;可以通过获取客户端的IP地址&#xff0c;然后与允许登录的IP地址列表进行比对。如果客户端的IP地址不在列表中&#xff0c;就禁止登录。 “php $…

HTTP 1.0 2.0 3.0详解

HTTP HTTP全称超文本传输协议&#xff0c;是一种属于应用层的通信协议。它允许将超文本标记语言文档&#xff08;HTML&#xff09;从Web服务器传输到客户端的浏览器。 HTTP报文结构 请求报文结构 请求方法&#xff1a; GET&#xff1a;一般用来请求已被URI识别的资源&#x…

永不失联!遨游双卫星三防手机成为高效应急关键所在

今年9月被戏称为“台风月”&#xff0c;台风“摩羯”、“贝碧嘉”以及热带气旋“普拉桑”接连来袭&#xff0c;极端天气不仅导致了电力中断、道路损毁&#xff0c;更使得传统的通信网络遭受重创&#xff0c;给应急通信保障工作带来了极大的压力。面对“三断”的实战难题&#x…

从文本图片到多模态:3D 数字人打开企业全域商业增长新空间

摘要&#xff1a;数字化与AI浪潮推动各行业变革&#xff0c;内容形式也发生巨变&#xff0c;从文本到多媒体的多模态表达&#xff0c;标志着内容创造走向升维。AIGC 3D生成技术的突飞猛进&#xff0c;彻底打破了传统3D内容生产门槛高、周期长、成本高昂的问题。将3D数字人的打造…

数学建模研赛总结

目录 前言进度问题四分析问题五分析数模论文经验分享总结 前言 本文为博主数学建模比赛第五天的内容记录&#xff0c;希望所写的一些内容能够对大家有所帮助&#xff0c;不足之处欢迎大家批评指正&#x1f91d;&#x1f91d;&#x1f91d; 进度 今天已经是最后一天了&#xf…

nginx常用的性能优化

第一步调整工作进程数&#xff1a; 设置成auto&#xff0c;会自动按照CPU核心数来启动工作进程数&#xff0c;如果设置具体数字&#xff0c;则只会使用指定数量的CPU核心&#xff0c;无法将CPU同一时间都能用得到&#xff0c;所以就不能发挥服务器的最大的性能。 第二步增加进程…

el-table添加fixed后错位问题

1 方案1 return {isShow:false, }mounted() {this.isShowtrue},watch: {$route(newRoute) {this.monitoredRoute newRoute; // 将新的路由信息保存到组件的monitoredRoute属性中// 执行其他操作或调用其他方法},//或$route(newRoute) {this.monitoredRoute newRoute; // 将新…

Java项目实战II基于Java+Spring Boot+MySQL的免税商品优选购物商城(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着全球贸易的日益繁荣和消费者需求的多样化&#xff0c;免税商品购物已成为众多旅行者和消费者的热…

浸没式密封连接器

在当今科技快速发展的背景下&#xff0c;电子设备的整合度与性能需求持续提高&#xff0c;而连接技术作为电子设备间交互的关键&#xff0c;其重要性显而易见。在各式各样的连接技术当中&#xff0c;浸没式密封连接器凭借其独到设计和高超性能&#xff0c;在特定使用环境中显示…

SpringBoot3中ymal配置文件(持续更新)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;JavaWeb关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 在SpringBoot项目中,使用application.properties进行配置管理时&#xff0c;…

实习问题(配置文件获取参数)

Java中用SpringBoot框架&#xff0c;当我们要获取配置文件yml里的参数时&#xff0c;用Value注解获取 如果配置文件中没有srvSealUploadPath这个参数的话&#xff0c;可以用Value("${srvSealUploadPath:data/idoc/temp}")&#xff0c;这个的意思是&#xff0c;如果配…

[大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26

[大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26 目录 文章目录 [大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26目录论文信息摘要主要内容包括&#xff1a;研究方法与资源的分类&#xff1a;结论&#xff1a; 论文信息 Title: Recent Advancement …

vector中push_back和emplace_back的区别

push_back 在引入右值引用&#xff0c;转移构造函数&#xff0c;转移复制运算符之前&#xff0c;通常使用push_back()向容器中加入一个右值元素&#xff08;临时对象&#xff09;的时候&#xff0c;首先会调用构造函数构造这个临时对象&#xff0c;然后需要调用拷贝构造函数将…

后端Java-SpringBoot整合MyBatisPlus步骤(超详细)

1.新建项目。 2.点击完上一步的next之后&#xff0c;选择pom.xml文件中的依赖。 3.点击pom文件进行项目初始化。 按照下面的俩步骤刷新一下maven &#xff0c;让文件生效 4.新建一个application.yml文件 5. 新建一个数据库mp&#xff0c;在数据库中新建一张user表 6.连接数据…

onnx TRT 版本对应关系

Onnx 版本和opset 关系 https://github.com/onnx/onnx/blob/main/docs/Versioning.md Onnx runtime 对应 onnx opset 版本 Compatibility | onnxruntime Tensor RT 和onnx 支持版本可以看如下并选择对应分支 https://github.com/onnx/onnx-tensorrt/blob/release/8.4-GA/doc…

三篇文章速通JavaSE到SpringBoot框架 (中) IO 进程线程 网络编程 XML MySQL JDBC相关概念与演示代码

文章目录 IOfile类的作用I/O的作用将上篇文章综合项目使用IO流升级所需知识点 进程 线程创建线程的三种方式 网络编程网络编程介绍IP地址端口号网络通信协议网络通信协议的分层演示代码 XMLXML的作用是什么&#xff1f;xml特点 注解什么是注解&#xff1f;注解的使用注解的重要…

【CSS in Depth 2 精译_040】6.3 CSS 定位技术之:相对定位(下)—— 用纯 CSS 绘制一个三角形

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09;第二章 相对单位&#xff08;已完结&#xff09;第三章 文档流与盒模型&#xff08;已完结&#xff09;第四章 Flexbox 布局&#xff08;已…