当前位置: 首页 > news >正文

leetcode 面试经典 150 题:矩阵置零

链接矩阵置零
题序号73
题型二维数组
解题方法标记数组法
难度中等
熟练度✅✅✅✅

题目

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。

  • 示例 1:
    输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
    输出:[[1,0,1],[0,0,0],[1,0,1]]
    在这里插入图片描述

  • 示例 2:
    输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
    输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
    在这里插入图片描述

  • 提示:
    m == matrix.length n == matrix[0].length
    1 <= m, n <= 200
    -231 <= matrix[i][j] <= 231 - 1

  • 进阶:
    一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。 你能想出一个仅使用常量空间的解决方案吗?

题解

  1. 核心要点
    • 标记0的位置:
      使用两个向量 row 和 col 来分别标记包含0的行和列。row 的长度为矩阵的行数 m,col 的长度为矩阵的列数 n。初始时,所有元素都设置为 false。
    • 遍历矩阵:
      第一个循环遍历矩阵的每个元素 matrix[i][j]。
      如果发现元素值为0,则将对应的 row[i] 和 col[j] 标记为 true。
    • 置零操作:
      第二个循环再次遍历矩阵,根据 row 和 col 的标记,将对应的行和列置零。
  2. 时间复杂度:O(mn)
  3. 空间复杂度:O(m+n)
  4. c++ 实现算法:
class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {int m = matrix.size();int n = matrix[0].size();vector<int> row(m), col(n);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (!matrix[i][j]) {row[i] = col[j] = true;}}}for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (row[i] || col[j]) {matrix[i][j] = 0;}}}}
};
  1. 演示:以示例1为例

假设我们有以下矩阵:

[
[1, 1, 1],
[1, 0, 1],
[1, 1, 1]
]
我们需要将所有包含0的行和列置零。

第一步:标记0的位置
我们使用两个向量 row 和 col 来标记包含0的行和列。

遍历矩阵的每个元素:
当我们遇到 matrix[1][1] = 0 时,我们将 row[1] 和 col[1] 标记为 true。
标记后的 row 和 col 向量如下:

row: [false, true, false]
col: [false, true, false]

第二步:置零操作
根据 row 和 col 的标记,我们将对应的行和列置零。

遍历矩阵的每个元素:
对于 matrix[1][0],由于 row[1] 为 true,我们将其置零。
对于 matrix[1][1],它已经是零,保持不变。
对于 matrix[1][2],由于 row[1] 为 true,我们将其置零。
对于 matrix[0][1] 和 matrix[2][1],由于 col[1] 为 true,我们将其置零。

最终得到的矩阵如下:

[
[1, 0, 1],
[0, 0, 0],
[1, 0, 1]
]

  1. c++ 完整demo:
#include <vector>
#include <iostream>using namespace std;class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {int m = matrix.size();int n = matrix[0].size();vector<int> row(m), col(n);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (!matrix[i][j]) {row[i] = col[j] = true;}}}for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (row[i] || col[j]) {matrix[i][j] = 0;}}}}
};// 用于打印矩阵的函数
void printMatrix(const vector<vector<int>>& matrix) {for (const auto& row : matrix) {for (int num : row) {cout << num << " ";}cout << endl;}
}int main() {// 创建一个示例矩阵vector<vector<int>> matrix = {{1, 1, 1},{1, 0, 1},{1, 1, 1}};cout << "Original matrix:" << endl;printMatrix(matrix);Solution solution;solution.setZeroes(matrix);cout << "Matrix after setting zeros:" << endl;printMatrix(matrix);return 0;
}
http://www.lryc.cn/news/512788.html

相关文章:

  • SQL中的TRIM用法
  • Git Flow 工作流:保障修改不破坏主功能的完整指南20241230
  • CentOS 7安装Docker详细教程
  • 如何在 Ubuntu 22.04 上安装 Varnish HTTP 教程
  • 网络安全概念详解
  • 【前端】-音乐播放器(源代码和结构讲解,大家可以将自己喜欢的歌曲添加到数据当中,js实现页面动态显示音乐)
  • PawSQL性能巡检平台 (3) - 慢查询采集和优化
  • 在docker中对MySQL快速部署与初始数据
  • Mysql(MGR)和ProxySQL搭建部署-Kubernetes版本
  • 将现有Web 网页封装为macOS应用
  • 药片(药丸)和胶囊识别数据集,使用yolo,pasical voc xml, coco json格式标注,可识别药片和胶囊两种标签,2445张原始图片
  • 在Linux的世界中怎么玩转定时器任务
  • HTML——20 自定义属性
  • 2025:OpenAI的“七十二变”?
  • mac docker部署jar包流程
  • 【postgresql 物化视图】自动刷新物化视图2种方法
  • HMSC联合物种分布模型
  • stm32f103zet6 ds18b20
  • 【前端,TypeScript】TypeScript速成(六):函数
  • React引入Echart水球图
  • 谷歌浏览器的智能推荐功能使用指南
  • GitHub 上排名前 11 的开源管理后台(Admin Dashboard)项目
  • 【运维】部署MKDocs
  • C# 读取多种CAN报文文件转换成统一格式数据,工具类:CanMsgRead
  • 计算机网络 (8)物理层的传输方式
  • 【C#】WPF设置Separator为垂直方向
  • 太速科技-519-基于ZU19EG的4路100G光纤的PCIe 加速计算卡
  • 安卓入门二 Kotlin基础
  • C++ ——— 单/多参数构造函数的隐式类型转换和 explicit 关键字
  • Java编程规约:集合处理