如皋做网站的公司/互联网推广中心

如皋做网站的公司,互联网推广中心,成立公司法人有啥要求,网站建设公司导航矩阵置零问题的原地算法 问题描述示例约束条件进阶要求 问题分析难点分析解题思路 代码实现代码说明 测试用例测试用例 1测试用例 2测试用例 3 总结 问题描述 给定一个 m x n 的矩阵,如果矩阵中的某个元素为 0,则需要将其所在的行和列的所有元素都置为 …

矩阵置零问题的原地算法

    • 问题描述
      • 示例
      • 约束条件
      • 进阶要求
    • 问题分析
      • 难点分析
      • 解题思路
    • 代码实现
      • 代码说明
    • 测试用例
      • 测试用例 1
      • 测试用例 2
      • 测试用例 3
    • 总结

问题描述

给定一个 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
  • -2^31 <= matrix[i][j] <= 2^31 - 1

进阶要求

  1. 一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
  2. 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
  3. 能否实现一个仅使用 常量空间 的解决方案?

问题分析

本题要求将矩阵中某些行和列置零,且必须使用原地算法。直接遍历矩阵并将对应行和列置零会导致信息丢失,因此需要一种方法来标记哪些行和列需要被置零。

难点分析

  1. 标记零的位置:如何在不使用额外矩阵的情况下记录哪些行和列需要被置零。
  2. 原地修改:在标记完成后,如何在不破坏标记信息的情况下完成置零操作。
  3. 第一行和第一列的特殊情况:如果第一行或第一列本身包含零,直接使用它们作为标记可能会导致误修改。

解题思路

我们可以通过以下步骤实现原地算法:

  1. 使用第一行和第一列作为标记

    • 遍历矩阵,如果某个元素为 0,则将该元素所在行的第一个元素和所在列的第一个元素置为 0。这样,第一行和第一列就成为了标记行和列是否需要置零的“索引”。
  2. 处理第一行和第一列的特殊情况

    • 如果第一行或第一列本身存在 0,则需要额外记录,因为它们会被用作标记,可能会被误修改。
  3. 根据标记置零

    • 遍历第一行和第一列的标记,将对应的行和列置零。
  4. 处理第一行和第一列

    • 最后根据之前记录的特殊情况,决定是否将第一行和第一列整体置零。

代码实现

以下是完整的 C 代码实现:

void setZeroes(int** matrix, int matrixSize, int* matrixColSize) {int firstRowZero = 0;           // 标记第一行是否需要置零int firstColZero = 0;           // 标记第一列是否需要置零// 检查第一行是否需要置零for (int j = 0; j < *matrixColSize; j++) {if (matrix[0][j] == 0) {firstRowZero = 1;break;}}// 检查第一列是否需要置零for (int i = 0; i < matrixSize; i++) {if (matrix[i][0] == 0) {firstColZero = 1;break;}}// 使用第一行和第一列作为标记for (int i = 1; i < matrixSize; i++) {for (int j = 1; j < *matrixColSize; j++) {if (matrix[i][j] == 0) {matrix[i][0] = 0;  // 标记该行需要置零matrix[0][j] = 0;  // 标记该列需要置零}}}// 根据标记置零(跳过第一行和第一列)for (int i = 1; i < matrixSize; i++) {for (int j = 1; j < *matrixColSize; j++) {if (matrix[i][0] == 0 || matrix[0][j] == 0) {matrix[i][j] = 0;}}}// 处理第一行if (firstRowZero) {for (int j = 0; j < *matrixColSize; j++) {matrix[0][j] = 0;}}// 处理第一列if (firstColZero) {for (int i = 0; i < matrixSize; i++) {matrix[i][0] = 0;}}
}

代码说明

  1. 标记逻辑

    • 使用第一行和第一列的元素作为标记,记录哪些行和列需要被置零。
  2. 特殊情况处理

    • 额外记录第一行和第一列是否需要被置零,因为它们会被用作标记。
  3. 置零操作

    • 根据第一行和第一列的标记,将对应的行和列置零。
  4. 原地修改

    • 整个过程只使用了常数级别的额外空间,满足原地算法的要求。

测试用例

以下是几个测试用例及其结果:

测试用例 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]
]

测试用例 3

输入:

matrix = [[1, 2, 3, 4],[5, 0, 7, 8],[9, 10, 11, 12]
]

输出:

[[1, 0, 3, 4],[0, 0, 0, 0],[9, 0, 11, 12]
]

总结

本题通过利用矩阵的第一行和第一列作为标记,实现了原地置零的功能。这种方法不仅满足了原地算法的要求,还具有较高的效率。时间复杂度为 O(m × n),空间复杂度为 O(1)

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

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

相关文章

25年携程校招社招求职能力北森测评材料计算部分:备考要点与误区解析

在求职过程中&#xff0c;能力测评是筛选候选人的重要环节之一。对于携程这样的知名企业&#xff0c;其能力测评中的材料计算部分尤为关键。许多求职者在备考时容易陷入误区&#xff0c;导致在考试中表现不佳。本文将深入解析材料计算部分的实际考察方向&#xff0c;并提供针对…

RuoYi框架添加自己的模块(学生管理系统CRUD)

RuoYi框架添加自己的模块&#xff08;学生管理系统&#xff09; 框架顺利运行 首先肯定要顺利运行框架了&#xff0c;这个我不多说了 设计数据库表 在ry数据库中添加表tb_student 表字段如图所示 如图所示 注意id字段是自增的 注释部分是后面成功后前端要展示的部分 导入…

2025最新群智能优化算法:山羊优化算法(Goat Optimization Algorithm, GOA)求解23个经典函数测试集,MATLAB

一、山羊优化算法 山羊优化算法&#xff08;Goat Optimization Algorithm, GOA&#xff09;是2025年提出的一种新型生物启发式元启发式算法&#xff0c;灵感来源于山羊在恶劣和资源有限环境中的适应性行为。该算法旨在通过模拟山羊的觅食策略、移动模式和躲避寄生虫的能力&…

博弈论算法

一、减法游戏 初始有一个数 n。 两个玩家轮流操作&#xff0c;每次可以减去 1 到 9 之间的任意整数。 将数减到 0 的玩家获胜。 可以发现规律&#xff1a; 减法游戏只需要判断当前数取模是否为0&#xff0c;即可快速判断胜负。 例题&#xff1a; Leetcode 292. Nim 游戏 …

Excel·VBA江西省预算一体化工资表一键处理

每月制作工资表导出为Excel后都需要调整格式&#xff0c;删除0数据的列、对工资表项目进行排序、打印设置等等&#xff0c;有些单位还分有“行政”、“事业”2个工资表就需要操作2次。显然&#xff0c;这种重复操作的问题&#xff0c;可以使用VBA代码解决 目录 代码使用说明1&a…

嵌入式学习笔记-卡尔曼滤波,PID,MicroPython

文章目录 卡尔曼滤波卡尔曼滤波的核心思想卡尔曼滤波的数学模型1. 状态转移模型&#xff08;预测系统状态&#xff09;2. 观测模型&#xff08;预测测量值&#xff09; 卡尔曼滤波的五个关键步骤1. 预测状态2. 预测误差协方差3. 计算卡尔曼增益4. 更新状态5. 更新误差协方差 卡…

一周热点-文本生成中的扩散模型- Mercury Coder

一、背景知识 在人工智能领域&#xff0c;文本生成模型一直是研究的热点。传统的大型语言模型多采用自回归架构&#xff0c;从左到右逐个预测下一个标记。这种模型虽然在生成连贯文本方面表现出色&#xff0c;但在速度上存在一定的局限性&#xff0c;因为它需要按顺序生成每个标…

Qt调试功能使用方法

QT编程环境 QT在Windows操作系统下的三种编程环境搭建。 方案编程环境编译器调试器1Qt CreatorMinGW GCCGDB2Qt CreatorMicrosoft Visual C CompilerDebugging Tools for Widows3Microsoft Visual Studio VS自带VS自带 方案提及的QT安装程序及压缩包均能在官网Index of /off…

vulnhub靶场之【digitalworld.local系列】的mercy靶机

前言 靶机&#xff1a;digitalworld.local-mercy&#xff0c;IP地址为192.168.10.11 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.6 kali采用VMware虚拟机&#xff0c;靶机选择使用VMware打开文件&#xff0c;都选择桥接网络 这里官方给的有两种方式&#xff0c;一…

Fiddler抓取App接口-Andriod/IOS配置方法

Andriod配置方法&#xff1a; 1&#xff09;确保手机和Fiddler所在主机在同一个局域网中 2&#xff09;获取Fiddler所在主机的ip地址&#xff0c;通过cmd命令进入命令编辑器&#xff0c;输入ipconfig -all&#xff0c;找到IPv4地址&#xff0c;记下该地址 3&#xff09;对手机…

步进电机软件细分算法解析与实践指南

1. 步进电机细分技术概述 步进电机是一种将电脉冲信号转换为角位移的执行机构&#xff0c;其基本运动单位为步距角。传统步进电机的步距角通常为 1.8&#xff08;对应 200 步 / 转&#xff09;&#xff0c;但在高精度定位场景下&#xff0c;这种分辨率已无法满足需求。细分技术…

C语言_数据结构总结2:动态分配方式的顺序表

0——静态分配内存的顺序表和动态分配内存的顺序表的相同之处和不同之处 相同之处 基本操作逻辑相同&#xff1a;无论是静态分配还是动态分配的顺序表&#xff0c;其核心的操作逻辑是一致的。例如插入操作都需要将插入位置之后的元素依次后移&#xff0c;删除操作都需要将删除…

Vue 与 Element UI 深度探秘:从 Array.isArray 到动态绑定的技术之旅!✨

以下是一篇深入的技术博客&#xff0c;基于我们对 compare-form.vue 和 <w-form-select.vue> 的所有讨论&#xff0c;涵盖 Array.isArray、option-label/option-value、:list 动态绑定、: 语法以及 Vue 2/3 兼容性等问题。博客风格轻松有趣&#xff0c;加入 SVG 图解和实…

计算机视觉|3D卷积网络VoxelNet:点云检测的革新力量

一、引言 在科技快速发展的背景下&#xff0c;3D 目标检测技术在自动驾驶和机器人领域中具有重要作用。 在自动驾驶领域&#xff0c;车辆需实时、准确感知周围环境中的目标物体&#xff0c;如行人、车辆、交通标志和障碍物等。只有精确检测这些目标的位置、姿态和类别&#x…

信奥赛CSP-J复赛集训(模拟算法专题)(3):P1089 [NOIP 2004 提高组] 津津的储蓄计划

信奥赛CSP-J复赛集训&#xff08;模拟算法专题&#xff09;&#xff08;3&#xff09;&#xff1a;P1089 [NOIP 2004 提高组] 津津的储蓄计划 题目描述 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300 300 300 元钱&#xff0c;津津会预算这个月的花销&#xff0…

数据结构--【顺序表与链表】笔记

顺序表 template <class T> class arrList :public List<T> //表示 arrList 类以公有继承的方式继承自 List<T> 类 //公有继承意味着 List<T> 类的公共成员在 arrList 类中仍然是公共成员&#xff0c;受保护成员在 arrList 类中仍然是受保护成员。 { …

2025最新群智能优化算法:基于RRT的优化器(RRT-based Optimizer,RRTO)求解23个经典函数测试集,MATLAB

一、基于RRT的优化器 基于RRT的优化器&#xff08;RRT-based Optimizer&#xff0c;RRTO&#xff09;是2025年提出的一种新型元启发式算法。其受常用于机器人路径规划的快速探索随机树&#xff08;RRT&#xff09;算法的搜索机制启发&#xff0c;首次将RRT算法的概念与元启发式…

im即时聊天客服系统SaaS还是私有化部署:成本、安全与定制化的权衡策略

随着即时通讯技术的不断发展&#xff0c;IM即时聊天客服系统已经成为企业与客户沟通、解决问题、提升用户体验的重要工具。在选择IM即时聊天客服系统时&#xff0c;企业面临一个重要决策&#xff1a;选择SaaS&#xff08;软件即服务&#xff09;解决方案&#xff0c;还是进行私…

mysql中in和exists的区别?

大家好&#xff0c;我是锋哥。今天分享关于【mysql中in和exists的区别?】面试题。希望对大家有帮助&#xff1b; mysql中in和exists的区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 MySQL 中&#xff0c;IN 和 EXISTS 都用于进行子查询&#xff0c;但它…

element-plus中table组件的使用

1、table组件的基本使用 注意&#xff1a; ①对象集合&#xff0c;要从后端查询。 ②prop是集合中的对象的属性名&#xff1b;label是表格表头的名称。 2、将性别一列的71转为男&#xff0c;72转为女 问题描述&#xff1a; 解决步骤&#xff1a; ①将el-table-column变成双标签…