关于0-1矩阵置1的问题

问题描述:一个矩阵,里面的元素只为1或者0,要求把元素为1的元素的同行和同列的所有元素都置为1,要求:算法空间复杂度为O(1).

 1 void _setRowAndCol(int arrays[], int row, int col)
 2 {
 3     assert(arrays != NULL && row > 0 && col > 0);
 4     
 5     int rowIndex = 0,colIndex = 0;
 6 
 7     for(int i = 0; i < row*col; i++)        //将原始1置为2
 8     {
 9         if(arrays[i] == 1)
10             ++arrays[i];
11     }
12 
13     for(int j = 0; j < row*col; j++)
14     {
15         if(arrays[j] > 1)
16         {
17             arrays[j] = 1;
18             rowIndex = j/col;            //记录下此处原始1的行和列的下标
19             colIndex = j-rowIndex*col;
20 
21             for(int n = 0; n < col; n++)    //同行置1
22             {
23                 if(arrays[rowIndex*col+n] == 0)
24                     arrays[rowIndex*col+n] == 1;
25             }
26             for(int m = 0; m < row; m++)    //同列置1
27             {
28                 if(arrays[m*col+colIndex] == 0)
29                     arrays[m*col+colIndex] == 1;
30             }
31         }
32     }
33 }

 

posted on 2014-11-23 17:24 Within_Temptation 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/geekpaul/p/4117101.html

### R6-1 矩阵零 PTA 解题思路 对于矩阵问题,在给定的一个 m×n 的矩阵中,如果某个元素为 0,则其所在的中的所有元素都要被设0。为了高效完成这一操作而不额外占用大量空间,可以采用一种巧妙的方法来标记哪些需要清零。 具体来说,先遍历整个数组找到所有的零位并记录下这些零所在的第一维索引(即号)以及第二维索引(即号)。但是为了避免开辟新的存储空间用于保存要清除的的信息,可以直接利用原矩阵的第一和第一为标志位来进标记[^1]。 当遇到 matrix[i][j]==0 时: - 如果 i 不等于 0 ,则将第 j 的第一个元素设为 0 (matrix[0][j]=0),表示该应该全部变为 0- 同样地,如果 j 不等于 0 ,那么也将第 i 的第一个元素设为 0 (matrix[i][0]=0),意味着此需全变作 0; 需要注意的是,由于可能会覆盖掉原本位于首的数据,因此还需要两个布尔变量分别用来记住原始矩阵中第一和第一是否有 0 存在的情况。最后再依据上述规则更新其他部分即可实现 O(1) 额外空间复杂度下的解法[^2]。 下面是 Python 实现代码示例: ```python def setZeroes(matrix): is_col = False R = len(matrix) C = len(matrix[0]) for i in range(R): if matrix[i][0] == 0: is_col = True for j in range(1, C): if matrix[i][j] == 0: matrix[0][j] = 0 matrix[i][0] = 0 for i in range(1, R): for j in range(1, C): if not matrix[i][0] or not matrix[0][j]: matrix[i][j] = 0 if matrix[0][0] == 0: for j in range(C): matrix[0][j] = 0 if is_col: for i in range(R): matrix[i][0] = 0 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值