2020年4月15日

今日算法题 542. 01 矩阵

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

自己题解

//没有执行效率
class Solution {
    public static int[][] updateMatrix(int[][] matrix) {
		for (int i = 0; i < matrix.length ; i++) {
			for (int j = 0; j < matrix[i].length ; j++) {
				if(matrix[i][j]!= 0){
					int i2 = searchLeft(matrix, i, j);
					int i3 = searchRight(matrix, i, j);
					int min = Math.min(i2, i3);
					matrix[i][j] = min;
				}
			}
			
		}
		
		return matrix;
	}
	public static int searchUp(int[][] arr,int i,int j){
		int tempUp = 1;
		//向上
		if(i >= 0){
			int i1 = arr[i][j];
			if(i1 == 0){
				return 0;
			}
			tempUp += searchUp(arr, i - 1, j);
			return tempUp;
		}
		return 20000;
	}
	public static int searchDown(int[][] arr,int i,int j){
		//向下
		int tempDown = 1;
		if(i < arr.length ){
			int i1 = arr[i ][j];
			if(i1 == 0 ){
				return 0;
			}
			tempDown += searchDown(arr, i + 1, j);
			return tempDown;
		}
		return 20000;
	}
	public static int searchLeft(int[][] arr,int i,int j){
		int min = 20000;
		for (int k = j; k >= 0 ; k--) {
			int i2 = searchDown(arr, i, k );
			int i4 = searchUp(arr, i, k );
			
			min = Math.min(min, i4+j-k);
			min = Math.min(i2+j-k, min);
		}
		return min;
	}
	public static int searchRight(int[][] arr,int i,int j){
		int min = 20000;
		for (int k = j; k < arr[i].length ; k++) {
			int i2 = searchDown(arr, i, k);
			int i4 = searchUp(arr, i, k );
			min = Math.min(min, i4+k-j);
			min = Math.min(i2+k-j, min);
		}
		return min;
	}
}

执行效率高的题解

//使用动态规划法,进行解题;暂时未能理解动态规划法
public int[][] updateMatrix2(int[][] matrix) {
		int row = matrix.length;
		int column = matrix[0].length;
		// 遍历
		for (int i = 0; i < row; i++) {
			for (int j = 0; j < column; j++) {
				if (matrix[i][j] == 1) {
					matrix[i][j] = row + column;
				}
				if (i > 0) {
					matrix[i][j] = Math.min(matrix[i][j], matrix[i-1][j] + 1);
				}
				if (j > 0) {
					matrix[i][j] = Math.min(matrix[i][j], matrix[i][j - 1] + 1);
				}
			}
		}
		
		for (int i = row - 1; i >= 0; i--) {
			for (int j = column - 1; j >= 0; j--) {
				if (i < row - 1) {
					matrix[i][j] = Math.min(matrix[i][j], matrix[i + 1][j] + 1);
				}
				if (j < column - 1) {
					matrix[i][j] = Math.min(matrix[i][j], matrix[i][j + 1] + 1);
				}
			}
		}
		return matrix;
	}
	

java面试题

  1. Iterator 怎么使用?有什么特点?
    Java中的Iterator功能比较简单,并且只能单向移动:
    (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
    (2) 使用next()获得序列中的下一个元素。
    (3) 使用hasNext()检查序列中是否还有元素。
    (4) 使用remove()将迭代器新返回的元素删除。
    Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
  2. Iterator 和 ListIterator 有什么区别?
    Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
    Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
    ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值