leetcode.73 矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法

示例 1:

输入: 
[
  [1,1,1],
  [1,0,1],
  [1,1,1]
]
输出: 
[
  [1,0,1],
  [0,0,0],
  [1,0,1]
]

示例 2:

输入: 

[
  [0,1,2,0],
  [3,4,5,2],
  [1,3,1,5]
]
输出: 
[
  [0,0,0,0],
  [0,4,5,0],
  [0,3,1,0]
]

进阶:

  • 一个直接的解决方案是使用  O(mn) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个常数空间的解决方案吗?

思路:通过使用一维数组记录下二维数组中为 0 的元素,其中一维数组的下标和二维数组的下标是对应的, 那么然后通过遍历一维数组,遇到元素为 1 ,再将其下标转换为对应的二维数组,这里用到了除数和求余,随后将其行和列弄为 0 即可,这题转换思想类似于时间日期的一道题,时间日期那道题就是将小时转换为分钟数再加上分钟数,求出最大的数后,在利用除法和求余将其转换为小时表示。

代码:

public class Solution {

	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[][] a = {{1,1,1},
				  {1,0,1},
				  {1,1,1}};
		setZeroes(a);
		for(int i = 0;i < a.length;i++) {
			for(int j = 0;j < a[i].length;j++) {
				System.out.print(a[i][j]+" ");
			}
		}
	}
	
	public static int[][] setZeroes(int[][] matrix) {
		int m = matrix.length;
		int n = matrix[0].length;
		int[] a = new int[m*n];
		for(int i = 0;i < m;++i) {
			for(int j = 0;j < n;++j){
				if(matrix[i][j] == 0) {
					a[i * n + j] = 1;
				}
			}
		}
		for(int k = 0;k < a.length;k++) {
			if(a[k] == 1) {{
				int b = k/n;
				int c = k%n;
				for(int i = 0;i < n;i++) {
					matrix[b][i] = 0;
				}
				for(int j = 0;j < m;j++) {
					matrix[j][c] = 0;
				}
			}
				
			}
		}
		return matrix;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_40904220/article/details/84891518
今日推荐