算法leetcode|73. 矩阵置零(rust重拳出击)


文章目录

  • 73. 矩阵置零:
    • 样例 1:
    • 样例 2:
    • 提示:
    • 进阶:
  • 分析:
  • 题解:
    • rust:
    • go:
    • c++:
    • python:
    • java:


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) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个仅使用常量空间的解决方案吗?

分析:

  • 面对这道算法题目,二当家的再次陷入了沉思。
  • 要遍历整个矩阵是肯定的了,所以时间复杂度上似乎没什么大的技巧,重点在空间复杂度上。
  • 不使用额外空间,直接在遍历中就将行和列置0,会导致还没有遍历到的值丢失。
  • 可以将原矩阵整体拷贝一份作为备份,然后遍历这个备份的矩阵,去直接将原矩阵置0,这样会使用 O(mn) 的额外空间。
  • 一个简单的改进方案是使用两个额外的数组,存储每一行是否出现过0,和每一列是否出现过0,然后再利用这两个额外的标记数组将原矩阵置0,这样会使用 O(m + n) 的额外空间。
  • 可以进一步优化,我们可以用矩阵的第一行和第一列代作为标记数组。但这样会导致原数组的第一行和第一列被修改,无法记录它们是否原本包含 0。因此我们需要额外使用两个标记变量分别记录第一行和第一列是否原本包含 0,这样仅仅需要 O(1) 的额外空间。

题解:

rust:

impl Solution {pub fn set_zeroes(matrix: &mut Vec<Vec<i32>>) {let (m, n) = (matrix.len(), matrix[0].len());let (mut flag_row0, mut flag_col0) = (false, false);// 第一行是否有0for i in 0..n {if matrix[0][i] == 0 {flag_row0 = true;break;}}// 第一列是否有0for i in 0..m {if matrix[i][0] == 0 {flag_col0 = true;break;}}// 标记(1..m).for_each(|i| {(1..n).for_each(|j| {if matrix[i][j] == 0 {matrix[i][0] = 0;matrix[0][j] = 0;}});});// 置0(1..m).for_each(|i| {(1..n).for_each(|j| {if matrix[i][0] == 0 || matrix[0][j] == 0 {matrix[i][j] = 0;}});});// 第一行置0if flag_row0 {for i in 0..n {matrix[0][i] = 0;}}// 第一列置0if flag_col0 {for i in 0..m {matrix[i][0] = 0;}}}
}

go:

func setZeroes(matrix [][]int)  {m, n := len(matrix), len(matrix[0])row0, col0 := false, false// 第一行是否有0for _, v := range matrix[0] {if v == 0 {row0 = truebreak}}// 第一列是否有0for _, r := range matrix {if r[0] == 0 {col0 = truebreak}}// 标记for i := 1; i < m; i++ {for j := 1; j < n; j++ {if matrix[i][j] == 0 {matrix[i][0] = 0matrix[0][j] = 0}}}// 置0for i := 1; i < m; i++ {for j := 1; j < n; j++ {if matrix[i][0] == 0 || matrix[0][j] == 0 {matrix[i][j] = 0}}}// 第一行置0if row0 {for i := 0; i < n; i++ {matrix[0][i] = 0}}// 第一列置0if col0 {for _, r := range matrix {r[0] = 0}}
}

c++:

class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {const int m = matrix.size(), n = matrix[0].size();bool flag_row0 = false, flag_col0 = false;// 第一行是否有0for (int i = 0; i < n; ++i) {if (!matrix[0][i]) {flag_row0 = true;break;}}// 第一列是否有0for (int i = 0; i < m; ++i) {if (!matrix[i][0]) {flag_col0 = true;break;}}// 标记for (int i = 1; i < m; ++i) {for (int j = 1; j < n; ++j) {if (!matrix[i][j]) {matrix[i][0] = matrix[0][j] = 0;}}}// 置0for (int i = 1; i < m; ++i) {for (int j = 1; j < n; ++j) {if (!matrix[i][0] || !matrix[0][j]) {matrix[i][j] = 0;}}}// 第一行置0if (flag_row0) {for (int i = 0; i < n; ++i) {matrix[0][i] = 0;}}// 第一列置0if (flag_col0) {for (int i = 0; i < m; ++i) {matrix[i][0] = 0;}}}
};

python:

class Solution:def setZeroes(self, matrix: List[List[int]]) -> None:"""Do not return anything, modify matrix in-place instead."""m, n = len(matrix), len(matrix[0])# 第一行是否有0flag_row0 = any(matrix[0][i] == 0 for i in range(n))# 第一列是否有0flag_col0 = any(matrix[i][0] == 0 for i in range(m))# 标记for i in range(1, m):for j in range(1, n):if matrix[i][j] == 0:matrix[i][0] = matrix[0][j] = 0# 置0for i in range(1, m):for j in range(1, n):if matrix[i][0] == 0 or matrix[0][j] == 0:matrix[i][j] = 0# 第一行置0if flag_row0:for j in range(n):matrix[0][j] = 0# 第一列置0if flag_col0:for i in range(m):matrix[i][0] = 0

java:

class Solution {public void setZeroes(int[][] matrix) {final int m        = matrix.length, n = matrix[0].length;boolean   flagRow0 = false, flagCol0 = false;// 第一行是否有0for (int i = 0; i < m; ++i) {if (matrix[i][0] == 0) {flagCol0 = true;break;}}// 第一列是否有0for (int i = 0; i < n; ++i) {if (matrix[0][i] == 0) {flagRow0 = true;break;}}// 标记for (int i = 1; i < m; ++i) {for (int j = 1; j < n; ++j) {if (matrix[i][j] == 0) {matrix[i][0] = matrix[0][j] = 0;}}}// 置0for (int i = 1; i < m; ++i) {for (int j = 1; j < n; ++j) {if (matrix[i][0] == 0 || matrix[0][j] == 0) {matrix[i][j] = 0;}}}// 第一行置0if (flagRow0) {for (int i = 0; i < n; ++i) {matrix[0][i] = 0;}}// 第一列置0if (flagCol0) {for (int i = 0; i < m; ++i) {matrix[i][0] = 0;}}}
}

非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】三连走一波~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot+mybatis-plus+dynamic-datasource+Druid 多数据源 分布式事务

Springbootmybatis-plusdynamic-datasourceDruid 多数据源事务&#xff0c;分布式事务 文章目录 Springbootmybatis-plusdynamic-datasourceDruid 多数据源事务&#xff0c;分布式事务0.前言1. 基础介绍ConnectionFactoryAbstractRoutingDataSource 动态路由数据源的抽象类 Dyn…

C++中数组作为参数进行传递方法

文章目录 基础&#xff1a;数组作为函数形参示例&#xff1a;1、一维数组的传递&#xff08;1&#xff09;直接传递&#xff08;2&#xff09;指针传递&#xff08;3&#xff09;引用传递 2、二维数组的传递&#xff08;1&#xff09;直接传递&#xff08;2&#xff09;指针传递…

华为云Stack的学习(二)

三、华为云Stack产品组件 FunsionSphere CPS 提供云平台的基础管理和业务资源&#xff08;包括计算资源和存储资源&#xff09;。采用物理服务器方式部署在管理节点。可以做集群的配置&#xff0c;扩容和运维管理。 Service OM 提供云服务的运维能力&#xff0c;采用虚拟化方…

【Java架构-包管理工具】-Maven进阶(二)

本文摘要 Maven作为Java后端使用频率非常高的一款依赖管理工具&#xff0c;在此咱们由浅入深&#xff0c;分三篇文章&#xff08;Maven基础、Maven进阶、私服搭建&#xff09;来深入学习Maven&#xff0c;此篇为开篇主要介绍Maven进阶知识&#xff0c;包含坐标、依赖、仓库、生…

网络地址转换NAT-动态NAT的使用范围和配置-思科EI,华为数通

网络地址转换NAT-动态NAT的使用范围和配置 什么是动态NAT&#xff1f; 使用公有地址池&#xff0c;并以先到先得的原则分配这些地址。当具有私有 IP 地址的主机请求访问 Internet 时&#xff0c;动态 NAT 从地址池中选择一个未被其它主机占用的 IP 地址一对一的转化。当数据会话…

Go几种读取配置文件的方式

比较有名的方案有 使用viper管理配置[1] 支持多种配置文件格式&#xff0c;包括 JSON,TOML,YAML,HECL,envfile&#xff0c;甚至还包括Java properties 支持为配置项设置默认值 可以通过命令行参数覆盖指定的配置项 支持参数别名 viper[2]按照这个优先级&#xff08;从高到低&am…

Linux驱动 - 20230828

练习. 驱动代码&#xff1a; #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/cdev.h> #include <linux/device.h> #include <linux/slab.h> #include <linux/uaccess.h> #include <…

Viobot硬件组成和接口

Viobot主要由主板、传感器板和外壳组成。具体尺寸可以在用户手册上面找到。 传感器板上面是双目摄像头和IMU&#xff0c;摄像头已经打了胶固定在外壳的前脸&#xff0c;由于涉及到传感器外参标定&#xff0c;所以不可自行拆卸。 LED补光灯版本&#xff1a; TOF版本&#xff1a…

2023-8-28 n-皇后问题

题目链接&#xff1a;n-皇后问题 第一种搜索顺序 #include <iostream>using namespace std;const int N 20;int n; char g[N][N]; bool row[N], col[N], dg[N], udg[N];void dfs(int x, int y, int s) {if(y n) y 0, x ;if(x n){if(s n){for(int i 0; i < n;…

【 Python 全栈开发 - 人工智能篇 - 45 】集成算法与聚类算法

文章目录 一、集成算法1.1 概念1.2 常用集成算法1.2.1 Bagging1.2.2 Boosting1.2.2.1 AdaBoost1.2.2.2 GBDT1.2.2.3 XgBoost 1.2.3 Stacking 二、聚类算法2.1 概念2.2 常用聚类算法2.2.1 K-means2.2.2 层次聚类2.2.3 DBSCAN算法2.2.4 AP聚类算法2.2.5 高斯混合模型聚类算法 一、…

第三方系统访问微搭低代码的后端API

微搭低代码使用的是文档型数据库&#xff0c;有时候会有数据集成的需求&#xff0c;将低代码的数据库中的数据抽取到第三方系统中。本篇就介绍一下本地抽取数据以及云函数中抽取数据 1 本地抽取数据 本地抽取数据我们以nodejs作为后端服务&#xff0c;本机要求先安装好nodejs…

构建数据可视化(基于Echarts,python)

构建数据可视化&#xff08;基于Echarts,python) 本文目录&#xff1a; 一、写在前面的题外话 二、数据可视化概念 三、用Python matplotlib库绘制数据可视化图 四、基于Echarts构建大数据可视化 4.1、安装echarts.js 4.2、数据可视化折线图制作 4.2.1、基础折线图 4.2…

JWT-Token

一、JWT 需要在 HTTP 这种无状态的机制下&#xff0c;记录下&#xff08;标识&#xff09;出来是不是连续&#xff08;逻辑上的连续&#xff09;的请求。 思路&#xff1a;如果多次请求&#xff0c;携带了相同的标识型数据&#xff0c;则认为是逻辑上连续的。这个标识&#xff…

【数据结构】 栈与队列的相互实现

文章目录 &#x1f30f;引言&#x1f340;[队列实现栈](https://leetcode.cn/problems/implement-stack-using-queues/)&#x1f431;‍&#x1f3cd;题目描述&#xff1a;&#x1f4cc;注意事项&#xff1a;&#x1f4cc;示例与提示&#xff1a; &#x1f431;‍&#x1f409;…

云计算在线实训系统建设方案

一、 人工智能与云计算系统概述 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一种模拟人类智能的科学和工程&#xff0c;通过使用计算机系统来模拟、扩展和增强人类的智能能力。人工智能涉及多个领域&#xff0c;包括机器学习、深度学习、自然…

2023全国大学生数学建模竞赛B题思路模型代码

目录 一.思路模型见文末名片&#xff0c;比赛开始9.7晚上第一时间更新 二.国赛常用算法之随机森林 3.思路获取见此 一.思路模型见文末名片&#xff0c;比赛开始9.7晚上第一时间更新 二.国赛常用算法之随机森林 # -*- coding: utf-8 -*- """ author: Administ…

实用调试技巧(1)

文章目录 目录1. 什么是bug&#xff1f;2. 调试是什么&#xff1f;有多重要&#xff1f;2.1 调试是什么&#xff1f;2.2 调试的基本步骤2.3 Debug和Release的介绍 3. Windows环境调试介绍3.1 调试环境的准备3.2 学会快捷键3.3 调试的时候查看程序当前信息3.3.1 查看临时变量的值…

身为程序员,你有哪些提高写代码效率的工具?

首先&#xff0c;每个程序员都是会利用工具的人&#xff0c;也有自己囊里私藏的好物。独乐乐不如众乐乐&#xff0c;今天笔者整理了3个辅助我们写代码的黑科技&#xff0c;仅供参考。如果你有更好的工具&#xff0c;欢迎评论区分享。 1、Google/Stackoverflow——搜索解决方案的…

作为Android 开发,该如何写好自己的简历……

不管在那个行业、那家公司、那个岗位&#xff0c;你去应聘面试&#xff0c;首先人家第一眼看的肯定是你的简历&#xff0c;先通过简历来初步判断你的能力&#xff0c;再到通知面试进行考察。所以简历是一张很重要牌&#xff0c;就看你怎么打了&#xff1f; 笔者本科毕业&#…

Vue2向Vue3过度Vuex核心概念mutations

目录 1 核心概念-mutations1.定义mutations2.格式说明3.组件中提交 mutations4.练习5.总结 2 带参数的 mutations1.目标&#xff1a;2.语法2.1 提供mutation函数&#xff08;带参数&#xff09;2.2 提交mutation 3 练习-mutations的减法功能1.步骤2.代码实现 4 练习-Vuex中的值…