ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

LeetCode hot100——73.矩阵置零

LeetCode hot100——73.矩阵置零 题目给定一个mxn的矩阵如果一个元素为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.lengthn matrix[0].length1 m, n 200-231 matrix[i][j] 231 - 1进阶一个直观的解决方案是使用O(mn)的额外空间但这并不是一个好的解决方案。一个简单的改进方案是使用O(mn)的额外空间但这仍然不是最好的解决方案。你能想出一个仅使用常量空间的解决方案吗题解class Solution { public void setZeroes(int[][] matrix) { int m matrix.length; int n matrix[0].length; boolean row0 false; boolean col0 false; // 判断第一行有没有0 for(int j 0; j n; j){ if(matrix[0][j] 0){ row0 true; break; } } // 判断第一列有没有0 for(int i 0; i m; i){ if(matrix[i][0] 0){ col0 true; break; } } // 使用第一行第一列做标记i,j从1开始 for(int i 1;i m;i){ for(int j 1;j n;j){ if(matrix[i][j] 0){ matrix[i][0] 0; matrix[0][j] 0; } } } // 根据标记置零 for(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; } } } // 处理第一行 if(row0){ for(int j 0; j n; j){ matrix[0][j] 0; } } // 处理第一列 if(col0){ for(int i 0; i m; i){ matrix[i][0] 0; } } } }思路题目要求遇到 0把整行整列置 0不能额外开数组记录哪些行、列要清零利用矩阵第一行、第一列充当标记数组。核心思路先用两个变量记录第一行、第一列本身是否含有 0遍历除第一行第一列以外的位置如果matrix[i][j]0就把该行第一个元素、该列第一个元素置为 0 做标记根据第一行、第一列的标记把对应行、列全部置 0最后根据最开始记录的两个变量处理第一行、第一列
返回列表