【Leetcode】【Medium】Set Matrix Zeroes

本文介绍了一种O(1)空间复杂度下实现矩阵中零元素及其所在行、列置零的方法,通过预设初始零元素的位置来标记需要置零的行列,最后统一置零操作。

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

 

解题思路:

题目乍一看很简单,将矩阵当前为0的位的行列都置为0;

问题在于:当遇到一个已知0时,不能立刻将其行列置0,因为这样会把原本不是0的位更改,导致继续遍历的时候无法区分哪些是初始0,哪些是后改0;

有一个解决方法,就是先遍历所有位,记录所有初始为0的行列坐标,遍历一遍之后,再统一做更改;

但是这个解决方法会占用额外的空间,如何使用o(1)空间完成置0的任务?

解决方法:

1、先找到一个初始0位置,并记录它的行oi和列oj;

2、oi行和oj列最终需要置零,索性将oi这一行和oj这一列当做记录数组;

3、遍历所有位置,如果遇到0,则将其i和j对应的(oi, j)和(i, oj)置0,这样不会多置0,也做到了标记的作用;

4、最终遍历oi这一行,将值为0的位置所在列置0;同理遍历oj这一列的元素,将其值为0的位置所在行置0;

 

代码:

 1 class Solution {
 2 public:
 3     void setZeroes(vector<vector<int>>& matrix) {
 4         int m = matrix.size();
 5         if (m == 0)
 6             return;
 7         int n = matrix[0].size();
 8         int oi = -1, oj = -1;
 9         for (int i = 0; i < m; ++i) {
10             for (int j = 0; j < n; ++j) {
11                 if (matrix[i][j] == 0) {
12                     oi = i;
13                     oj = j;
14                     break;
15                 }
16             }
17             if (oi != -1) break;
18         }
19         if (oi == -1) return;
20         
21         for (int i = 0; i < m; ++i) {
22             for (int j = 0; j < n; ++j) {
23                 if (matrix[i][j] == 0) {
24                     matrix[oi][j] = 0;
25                     matrix[i][oj] = 0;
26                 }
27             }
28         }
29         
30         for (int i = 0; i < m; ++i) {
31             if (i != oi && matrix[i][oj] == 0) { // notice
32                 for (int j = 0; j < n; ++j)
33                     matrix[i][j] = 0;
34             }
35         }
36         
37         for (int j = 0; j < n; ++j) {
38             if (matrix[oi][j] == 0) {
39                 for (int i = 0; i < m; ++i)
40                     matrix[i][j] = 0;
41             }
42         }
43         
44         for (int j = 0; j < n; ++j) 
45             matrix[oi][j] = 0;
46         
47         return;
48     }
49 };

 

转载于:https://www.cnblogs.com/huxiao-tee/p/4775728.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值