今日算法题 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面试题
- 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中插入和删除元素。 - Iterator 和 ListIterator 有什么区别?
Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。