给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离

20 篇文章 0 订阅
2 篇文章 0 订阅
题目描述:

给定一个由 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的值

//实参替换形参中不为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; //值过大防止内存溢出
	      }
	   }
    }
}

输出:

	[
		[0,0,0],
		[0,9007199254740991,0],
		[9007199254740991,9007199254740991,9007199254740991],
		[9007199254740991,9007199254740991,9007199254740991],
	]

二、根据实参矩阵修改矩阵中为0的值

2.1此时从左至右从上至下,各元素只与上左元素作比较
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若小则取之    
	}
}

输出:

 [
    [ 0, 0, 0 ],
    [ 0, 1, 0 ],
    [ 1, 2, 1 ],
    [ 2, 3, 2 ]  
]
2.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若小则取之    
	}
 }

输出

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

![图片.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91c2VyLWdvbGQtY2RuLnhpdHUuaW8vMjAyMC80LzE1LzE3MTdkZTYxMGFhNzlkODY?x-oss-process=image/format,png)### 强烈推荐

**如果这篇文章帮助到了你,欢迎点赞和关注,搜索《叫我詹躲躲》加入我们的技术群一起学习讨论,共同探索前端的边界。**


![image](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xMzM0MTI3NS04ODc0ODRmMWNiMTJhNDEx?x-oss-process=image/format,png)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值