只有刷不完的题,没有过不去的坎:
Set Matrix Zeroes
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.
举个栗子:
给定一个数组:
1 2 3 1 0 0
4 0 5 -------变换后--------> 0 0 0
7 8 0 0 0 0
这道题以前的说明还有下面的话:
Follow up: 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?(ps:m*n的空间复杂度是最糟糕的, m + n 的复杂度依旧不是最好的)
(分析学习自《LeetCode-cpp》)其实O(m+n)的方法很简单,我们只需遍历一遍,用两个数组分别分别记录每行每列是否存在0,遍历完毕后,把对应的值一设置就ok了!
再进一步想一下,其实可以不用申请两个数组,我们完全可以复用原数组中的第一行和第一列。既然要占用这第一行和第一列,首先我们应当记录下第一行和第一列是否存在0,然后才能把这块空间拿来借用。
分析到这,想必你已经了解了大体的思路了,让我们来看看具体的编程实现吧:
首先是整体的框架:
函数原型当然是给定的了,照着这个原型随便写一个矩阵,用来测试。/* * Set Matrix Zeroes * Given a m x n matrix, if an element is 0, set its entire row and column to 0. * Do it in place. */ #include <stdio.h> #include <stdlib.h> #define N 3 void setZeroes(int** matrix, int matrixRowSize, int matrixColSize) { } int main() { int * matrix[N]; int i = 0, j = 0; for (i = 0; i < N; i++) { matrix[i] = (int *)malloc(N * sizeof(int)); } for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { matrix[i][j] = 3; } } matrix[1][2] = 0; matrix[0][1] = 0; setZeroes(matrix, 3, 3); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { printf("%d ", matrix[i][j]); } printf("\n"); } for (i = 0; i < N; i++) { free(matrix[i]); } return 0; }
再然后就是函数的设计了:
有了之前的分析加上注释的提示,相信看懂这段代码毫无问题了。void setZeroes(int** matrix, int matrixRowSize, int matrixColSize) { int row_has_zero = 0; int col_has_zero = 0; int i = 0, j = 0; for (i = 0; i < matrixColSize; i++) //检查第一行有没有0 { if (matrix[0][i] == 0) { row_has_zero = 1; break; } } for (i = 0; i < matrixRowSize; i++) //检查第一列有没有0 { if (matrix[i][0] == 0) { col_has_zero = 1; break; } } for (i = 1; i < matrixRowSize; i++) //将为0的元素的行列做标记 { for (j = 1; j < matrixColSize; j++) { if (matrix[i][j] == 0) { matrix[0][j] = 0; matrix[i][0] = 0; } } } for (i = 1; i < matrixRowSize; i++) //将有标记的行列对应元素都置0 { for (j = 1; j < matrixColSize; j++) { if ((matrix[i][0] == 0) || (matrix[0][j] == 0)) { matrix[i][j] = 0; } } } if (row_has_zero == 1) { for (i = 0; i < matrixColSize; i++) { matrix[0][i] = 0; } } if (col_has_zero == 1) { for (i = 0; i < matrixRowSize; i++) { matrix[i][0] = 0; } } }
最后这道题给我的启示是:在限定空间复杂度的情况下,我们可以考虑一下是否能够复用原有的空间来达到目的。
Set Matrix Zeroes
最新推荐文章于 2020-02-09 12:21:36 发布