給定一個由 0 和 1 組成的矩陣,找出每一個元素到最近的 0 的距離。
兩個相鄰元素間的距離爲 1 。
示例 1: 輸入: 0 0 0 0 1 0 0 0 0
輸出: 0 0 0 0 1 0 0 0 0
示例 2: 輸入: 0 0 0 0 1 0 1 1 1
輸出: 0 0 0 0 1 0 1 2 1
注意:
給定矩陣的元素個數不超過 10000。
給定矩陣中至少有一個元素是 0。
矩陣中的元素只在四個方向上相鄰: 上、下、左、右。
示例:建立一個根據行列,建立數組,並填入數字;數組
let col = 3; //列數 let row = 3; //行數 let matrix = []; //建立一個數組存儲空間 let num = 1; //填入的值 for(let i=0;i<row;i++){ matrix[i] = []; //建立三維數組行空間 for(let j=0;j<col;j++){ matrix[i][j]=num; //填入數字 num++; } }
輸出: [ [1,2,3], [4,5,6], [7,8,9], ]
//實參替換形參中不爲0的值,保留爲0的值 var updateMatrix = function(matrix) { let row = matrix.length; //獲取矩陣的行數 let col = matrix[0].length; //獲取矩陣的列 var temp = [];//建立一個數組存儲空間 for(var i = 0; i < row; i++){ temp[i] = []; for(var j = 0 ; j < col; j++){ if (matrix[i][j] == 0) { temp[i][j] = 0; }else{ temp[i][j] = Number.MAX_SAFE_INTEGER; //值過大防止內存溢出 } } } }
輸出:
spa
[ [0,0,0], [0,9007199254740991,0], [9007199254740991,9007199254740991,9007199254740991], [9007199254740991,9007199254740991,9007199254740991], ]
for (var i = 0; i < row; i++){ for (var j = 0; j < col; j++){ //此時從左至右從上至下,各元素只與上左元素做比較 if (j > 0) temp[i][j] = Math.min(temp[i][j - 1] + 1, temp[i][j]); //左邊元素加1若小則取之 if (i > 0) temp[i][j] = Math.min(temp[i - 1][j] + 1, temp[i][j]); //上邊元素加1若小則取之 } }
輸出:
code
[ [ 0, 0, 0 ], [ 0, 1, 0 ], [ 1, 2, 1 ], [ 2, 3, 2 ] ]
for (var i = row - 1; i >= 0;i--){ for (var j = col - 1; j >= 0; j--) { //此時從右至左從下至上,各元素可與下右元素做比較 if (j < col - 1) temp[i][j] = Math.min(temp[i][j + 1] + 1, temp[i][j]); //左邊元素加1若小則取之 if (i < row - 1) temp[i][j] = Math.min(temp[i + 1][j] + 1, temp[i][j]); //上邊元素加1若小則取之 } }
輸出
blog
[ [ 0, 0, 0 ], [ 0, 1, 0 ], [ 1, 2, 1 ], [ 2, 3, 2 ], ]
var updateMatrix = function(matrix) { //步驟一 let row = matrix.length; //獲取矩陣的行數 let col = matrix[0].length; //獲取矩陣的列 var temp = [];//建立一個數組存儲空間 for(var i = 0; i < row; i++){ temp[i] = []; for(var j = 0 ; j < col; j++){ if (matrix[i][j] == 0) { temp[i][j] = 0; }else{ /* 值過大防止內存溢出 */ temp[i][j] = Number.MAX_SAFE_INTEGER; } } } //步驟二 for (var i = 0; i < row; i++){ for (var j = 0; j < col; j++){ //此時從左至右從上至下,各元素只與上左元素做比較 if (j > 0) /* 左邊元素加1若小則取之 */ temp[i][j] = Math.min(temp[i][j - 1] + 1, temp[i][j]); if (i > 0) /* 上邊元素加1若小則取之 */ temp[i][j] = Math.min(temp[i - 1][j] + 1, temp[i][j]); } } //步驟三 for (var i = row - 1; i >= 0;i--){ for (var j = col - 1; j >= 0; j--) { //此時從右至左從下至上,各元素可與下右元素做比較 if (j < col - 1) /* 左邊元素加1若小則取之 */ temp[i][j] = Math.min(temp[i][j + 1] + 1, temp[i][j]); if (i < row - 1) /* 上邊元素加1若小則取之 */ temp[i][j] = Math.min(temp[i + 1][j] + 1, temp[i][j]); } } return temp; };