Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in-place.
Example 1:
1 | Input: |
Example 2:
1 | Input: |
Follow up:
- A straight forward solution using O(m**n) 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?
1 原地标记(失败)
本来打算用原地标记的. 某个元素加上(max-min+1)后为标记, 标记后的元素减去(max-min+1)可以还原为原来的元素.
但是测试案例中有INT_MIN和INT_MAX, 这样会溢出.
我也想改进一下原地标记的方法,但我实在想不出来既兼容INT_MAX, INT_MIN, 又只有常数空间占用的方法了😭😭😭
1 | // This method failed when encounters [[-4,-2147483648,6,-7,0],[-8,6,-8,-6,0],[2147483647,2,-9,-6,-10]] |
2 原地标记2
考虑利用matrix的第0行和第0列来标记矩阵的某一行或某一列是否出现过0
- 首先创建两个变量
ifrow0has0
和ifcolumn0has0
并检查第0行和第0列是否含有0, 如果是, 将相应的值更新为true.(这时第0行和第0列的信息储存在这两个变量中了, 然后在上面标记含有0的列或含有0的行不会产生影响) - 从第1行第1列开始遍历整个矩阵, 若第i行第j列含有0, 则将第0行第j个元素标记为0, 和第i行第0个元素标记为0(意味着接下来第i行所有元素和第j列所有元素都要被归0)
- 根据
ifrow0has0
和ifcolumn0has0
判断是否将第0行的全部元素归0或将第0列的元素归0
1 | class Solution { |