题目描述
数组从左至右递增,从上至下递增。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
输入输出用例
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
给定 target = 5,返回 true。
给定 target = 20,返回 false。
题解
/*
------------>
|
|
|
|
v
数组如图,左上角是最小的,右下角是最大的。
从这两个点出发的话,需要进行判断:
- 一左上角为例,它的右边和下标都是大于自己的,
- 如果目标元素大于自己,那么自己是不好办的了
换个方面想,如果从右上角或者左下角,会怎么样呢?
- 如果目标元素大于当前所在元素值
- 该元素左边的值都是小于它的,所以它左边全部都不要考虑了
- 该元素下标的值都是大于它的,所以它可以放心往下走
- 如果目标元素小于当前所在元素值,与上面的分析相反
- 左边都是小于它的,放心往左边走
- 下边都是大于它的,不能走了
*/
测试用例
/*
测试用例:
合理的输入:
数组中有该元素
数组中没有该元素
不合理的输入:
矩阵为空
特殊输入:
矩阵只有一行
矩阵只有一列
*/
代码:
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix.length == 0 || matrix[0].length == 0) return false;
int rows = matrix.length; // 行数
int columns = matrix[0].length; // 列数
// 从右上角开始
int row = 0, col = columns-1;
// 循环的条件得选好
while(row < rows && col >= 0){
// 如果目标元素大于当前元素,左边不走了,下边可以走
if(target > matrix[row][col]){
row++;
}
// target小于当前元素,下标不可以走了
else if(target < matrix[row][col]){
col--;
}
// target等于当前元素,返回 true
else{
return true;
}
}
return false;
}
}
注意点:
while语句中的 if 条件判断语句
,不能写成三个 if 条件判断语句 。
因为这样会发生数组越界。
// 会发生数组越界
if(target > matrix[row][col]){
row++;
}
if(target < matrix[row][col]){
col--;
}
if(target == matrix[row][col]){
return true;
}