问题描述:
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?
问题分析
这个问题在之前的一篇文章里有过详细的讨论。 这个问题的主要思路在于,当我们每次在矩阵里碰到一个为0的元素的时候不能直接就将它的当前行和列设置为0。因为一旦这样设置之后,就可能将后面的元素里那些原来不是0的元素设置成了0。而这样在后面的遍历里会以为这些元素是本来为0的,可能导致最后设置的结果不对。所以这里采用的是一种类似于坐标图的办法,将矩阵的第一行和第一列作为标记轴。在从除第一行第一列的元素开始进行遍历的时候,碰到为0的元素就将对应的行和列的坐标对应的值设置为0。这样遍历完元素之后就将对应的点都打好了。剩下的就是遍历第一行和第一列,将碰到为0的元素对应的行或者列全置为0。
这里还有一个比较容易错的细节,就是我们后面的遍历会修改第一行和第一列的值。如果第一行或者第一列里原来有0的元素的话,照理说它们是应该要把当前行或者列清零的。所以我们实现要把这两种可能出现的情况给记录下来,然后才做元素遍历。在这些坐标点都设置完之后再来将坐标轴的元素设置好。
详细的实现如下:
public class Solution { public void setZeroes(int[][] matrix) { int m = matrix.length; int n = matrix[0].length; boolean rowZero = false, colZero = false; for(int i = 0; i < m; i++) if(matrix[i][0] == 0) colZero = true; for(int i = 0; i < n; i++) if(matrix[0][i] == 0) rowZero = true; for(int i = 1; i < m; i++) { for(int j = 1; j < n; j++) { if(matrix[i][j] == 0) { matrix[0][j] = 0; matrix[i][0] = 0; } } } for(int i = 1; i < n; i++) { if(matrix[0][i] == 0) { for(int j = 1; j < m; j++) matrix[j][i] = 0; } } for(int i = 1; i < m; i++) { if(matrix[i][0] == 0) { for(int j = 1; j < n; j++) matrix[i][j] = 0; } } if(rowZero) { for(int i = 0; i < n; i++) matrix[0][i] = 0; } if(colZero) { for(int i = 0; i < m; i++) matrix[i][0] = 0; } } }
相关推荐
《Leetcode: 和你一起轻松刷题》是一本专为编程爱好者与算法学习者精心打造的电子书。本书通过精心挑选的LeetCode经典题目,结合深入浅出的解析与实战技巧,引领读者逐步掌握算法精髓。书中不仅覆盖了数据结构与算法...
13-3 LeetCode:198. 打家劫舍.mp4
12-5 LeetCode:101. 对称二叉树.mp4
12-3 LeetCode:226. 翻转二叉树.mp4
14-2 LeetCode:455. 分饼干.mp4
13-2 LeetCode:70. 爬楼梯.mp4
15-3 LeetCode:78. 子集 (2).mp4
15-2 LeetCode:46. 全排列 (2).mp4
10-5 LeetCode:23. 合并K个排序链表.mp4
10-4 LeetCode:347. 前 K 个高频元素.mp4
11-9 LeetCode:21. 合并两个有序链表.mp4
14-3 LeetCode:122. 买卖股票的最佳时机 II.mp4
12-2 LeetCode:374. 猜数字大小 (2).mp4
12-4 LeetCode:100. 相同的树 (2).mp4
10-3 LeetCode:215. 数组中的第 K 个最大元素.mp4
leetcode 非官方顺序leetcode题解,主要代码为Python和C++。 leetcode 第1题: leetcode 第2题: leetcode 第3题: leetcode 第4题: leetcode 第5题: leetcode 第6题: leetcode 第7题: leetcode 第9题: ...
leetcode11 top 1. 位运算 LeetCode191 : 二进制位1的个数 LeetCode338 : 比特位运算 2. 字典树 LeetCode209 : 实现一个Trie结构 LeetCode79 : 单词搜索(判断单词是否出现在给定的网格中) LeetCode212 : 单词搜索II...
示例 1:输入:[[1,2,3],[4,5,6],[7,8,9]]输出:[[1,4,7],[2,5,8],[3,6,9]]示例 2:输入:[[1,2,3],[4
删除链表中等于给定值 val 的所有节点。 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3->4->5
2、解题思路一开始没有理解题意,实际上,这道题目描述不够清楚基本题意如下:数组的下标,对应一个偏移量,表示下一步能够到达的下标举个例子输入:我们将每一个下标,都