題目:
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
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?
題解:
這道題是CC150 1.7上面的原題。可以看上面詳盡的解釋,我就不寫了。
程式碼如下:
1 public void setZeroes(int[][] matrix) {
2 int m = matrix.length;
3 int n = matrix[0].length;
4
5 if(m==0||n==0)
6 return;
7 int[] flagr = new int[m];
8 int[] flagc = new int[n];
9
10 for(int i=0;i<m;i++){
11 for(int j=0;j<n;j++){
12 if(matrix[i][j]==0){
13 flagr[i]= 1;
14 flagc[j]= 1;
15 }
16 }
17 }
18
19 for(int i=0;i<m;i++){
20 for(int j=0;j<n;j++){
21 if(flagr[i]==1||flagc[j]==1){
22 matrix[i][j]=0;
23 }
24 }
25 }
26 }
2 int m = matrix.length;
3 int n = matrix[0].length;
4
5 if(m==0||n==0)
6 return;
7 int[] flagr = new int[m];
8 int[] flagc = new int[n];
9
10 for(int i=0;i<m;i++){
11 for(int j=0;j<n;j++){
12 if(matrix[i][j]==0){
13 flagr[i]= 1;
14 flagc[j]= 1;
15 }
16 }
17 }
18
19 for(int i=0;i<m;i++){
20 for(int j=0;j<n;j++){
21 if(flagr[i]==1||flagc[j]==1){
22 matrix[i][j]=0;
23 }
24 }
25 }
26 }
另一種方法是不需要額外空間的,程式碼來自discuss:
1 public void setZeroes(int[][] matrix) {
2 int rownum = matrix.length;
3 if (rownum == 0) return;
4 int colnum = matrix[0].length;
5 if (colnum == 0) return;
6
7 boolean hasZeroFirstRow = false, hasZeroFirstColumn = false;
8
9 // Does first row have zero?
10 for (int j = 0; j < colnum; ++j) {
11 if (matrix[0][j] == 0) {
12 hasZeroFirstRow = true;
13 break;
14 }
15 }
16
17 // Does first column have zero?
18 for (int i = 0; i < rownum; ++i) {
19 if (matrix[i][0] == 0) {
20 hasZeroFirstColumn = true;
21 break;
22 }
23 }
24
25 // find zeroes and store the info in first row and column
26 for (int i = 1; i < matrix.length; ++i) {
27 for (int j = 1; j < matrix[0].length; ++j) {
28 if (matrix[i][j] == 0) {
29 matrix[i][0] = 0;
30 matrix[0][j] = 0;
31 }
32 }
33 }
34
35 // set zeroes except the first row and column
36 for (int i = 1; i < matrix.length; ++i) {
37 for (int j = 1; j < matrix[0].length; ++j) {
38 if (matrix[i][0] == 0 || matrix[0][j] == 0) matrix[i][j] = 0;
39 }
40 }
41
42 // set zeroes for first row and column if needed
43 if (hasZeroFirstRow) {
44 for (int j = 0; j < colnum; ++j) {
45 matrix[0][j] = 0;
46 }
47 }
48 if (hasZeroFirstColumn) {
49 for (int i = 0; i < rownum; ++i) {
50 matrix[i][0] = 0;
51 }
52 }
53 }
2 int rownum = matrix.length;
3 if (rownum == 0) return;
4 int colnum = matrix[0].length;
5 if (colnum == 0) return;
6
7 boolean hasZeroFirstRow = false, hasZeroFirstColumn = false;
8
9 // Does first row have zero?
10 for (int j = 0; j < colnum; ++j) {
11 if (matrix[0][j] == 0) {
12 hasZeroFirstRow = true;
13 break;
14 }
15 }
16
17 // Does first column have zero?
18 for (int i = 0; i < rownum; ++i) {
19 if (matrix[i][0] == 0) {
20 hasZeroFirstColumn = true;
21 break;
22 }
23 }
24
25 // find zeroes and store the info in first row and column
26 for (int i = 1; i < matrix.length; ++i) {
27 for (int j = 1; j < matrix[0].length; ++j) {
28 if (matrix[i][j] == 0) {
29 matrix[i][0] = 0;
30 matrix[0][j] = 0;
31 }
32 }
33 }
34
35 // set zeroes except the first row and column
36 for (int i = 1; i < matrix.length; ++i) {
37 for (int j = 1; j < matrix[0].length; ++j) {
38 if (matrix[i][0] == 0 || matrix[0][j] == 0) matrix[i][j] = 0;
39 }
40 }
41
42 // set zeroes for first row and column if needed
43 if (hasZeroFirstRow) {
44 for (int j = 0; j < colnum; ++j) {
45 matrix[0][j] = 0;
46 }
47 }
48 if (hasZeroFirstColumn) {
49 for (int i = 0; i < rownum; ++i) {
50 matrix[i][0] = 0;
51 }
52 }
53 }