给定一个m*n的矩阵,如果一个元素为0,则将其所在行和列的所有元素都设为0,请使用原地算法。(在计算机科学中,一个原地算法(in-place algorithm)是一种使用小的,固定数量的额外之空间来转换资料的算法。当算法执行时,输入的资料通常会被要输出的部分覆盖掉。不是原地算法有时候称为非原地(not-in-place)或不得其所(out-of-place)。)
示例1:
cs输入:matrix = [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例2:
cs输入: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.lengthn == matrix[0].length1 <= m, n <= 200-2的31次 <= matrix[i][j] <= 2的31次 - 1进阶:
- 一个直观的解决方案是使用
O(m n)的额外空间,但这并不是一个好的解决方案。- 一个简单的改进方案是使用
O(m+n)的额外空间,但这仍然不是最好的解决方案。- 你能想出一个仅使用常量空间的解决方案吗?
解题思路:使用两个标记数组分布记录每一行和每一列是否有零出现。
首先遍历该数组一次,如果某个元素为0,那么就将该元素所在的行和列所对应标记数组的位置置为true。最后再次遍历该数组,用标记数组更新原数组。
csvoid setZeroes(int** matrix, int matrixSize, int* matrixColSize) { int m = matrixSize,n=matrixColSize[0],row[m],col[n]; memset(row,0,sizeof(row)); memset(col,0,sizeof(col)); 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; }时间复杂度:O(mn),其中 m 是矩阵的行数,n 是矩阵的列数。我们至多只需要遍历该矩阵两次。
空间复杂度:O(m+n),其中 m 是矩阵的行数,n 是矩阵的列数。我们需要分别记录每一行或每一列是否有零出现。
LeetCode 第73题:矩阵置零
IC 见路不走2025-06-15 10:14
相关推荐
地平线开发者11 分钟前
征程6工具链模型X86推理方式说明地平线开发者15 分钟前
【征程6】校准量化中HistogramObserver解析OuO-21 小时前
笔试强训 Day 34:ISBN 号码、kotori 和迷宫、矩阵最长递增路径程序喵大人2 小时前
【C++进阶】STL算法与函数对象 - 04 find、count和any_of把查询写成意图豆沙沙包?2 小时前
c++中引用(P7-P11)不会代码的小猴2 小时前
标准模板库(STL)ZhouDevin2 小时前
算法论文/高效微调4——DoRA:权重分解的低秩适配方法evans在进步3 小时前
LeetCode 200:岛屿数量——Java DFS 染色法详解AI探索先锋3 小时前
A* 路径规划:四种算法的进化史-学习旖旎夜光3 小时前
LeetCode 202:快乐数(双指针问题) —— 题解
