leetcode.73 矩陣置零
阿新 • • 發佈:2018-12-08
給定一個 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; } }