1. 程式人生 > >leetcode.73 矩陣置零

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;
	}
}