题解 | #二维数组中的查找#
二维数组中的查找
https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e
思路
(我一开始的解法是暴力解,后面看了一下题解,又自己依据思路写了个线性搜索)
暴力解:
遍历整个二维数组的首位数组元素,对小于目标值的数组进行一次遍历比较,大于目标值时,结束本轮循环。当一直到首位数组元素大于目标值时,直接结束循环
线性搜索思路:
利用二维数组行列递增特性
- 由于行列递增,可以得出:
- 在一列中的某个数字,其上的数字都比它小
- 在一行中的某个数字,其右的数字都比它大
- 搜索流程:
- 首先从数组左下角搜索,
- 如果当前数字大于target,直接结束本轮循环,如果当前数字小于target,进行遍历,当遇到第一个大于目标值的节点时,记录位置,并设置为下一次循环的起点
- 查找到target,.返回true;
代码
public class Solution {
public boolean Find(int target, int [][] array) {
// 代码健壮性检验
if (array == null || array[0].length == 0) {
return false;
}
// 设置搜索起点,默认为0
int start = 0;
for (int length = array.length; length > 0; length--) {
// 如果首元素就大于目标值,则没有继续的必要
if (array[length - 1][0] > target) {
continue;
}
for (int i = start; i < array[0].length; i++) {
if (array[length - 1][i] == target) {
return true;
}
// 当遇到第一个大于目标值的节点时,记录位置,并设置为下一次循环的起点
if (array[length - 1][i] > target) {
start = i;
break;
}
}
}
return false;
}
}