二维数组中的查找
题目描述
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,
输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。LeetCode链接
示例
现有矩阵 matrix 如下:
[
[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
。
解法1:暴力求解
分析
根据传统思路,我们可以遍历二维数组中的每一个元素
- 如果找到一个就返回true
- 如果遍历完整个数组还没有找到就返回false
代码实现
class Solution
{
public boolean findNumberIn2DArray(int[][] matrix, int target)
{
//判断特殊情况 矩阵为空或者矩阵行或者列为空
if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
{
return false;
}
//遍历二维数组
for (int[] ints : matrix)
{
for (int j = 0; j < matrix[0].length; j++)
{
if (ints[j] == target)//如果找到
{
return true;//返回true
}
}
}
//遍历完整个数组都没找到,返回false
return false;
}
}
解法2:线性查找
分析
由于 每一行都是按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,所以我们可以借用二分查找的思想,当访问一个元素时,就可以排除数组中的部分元素。
步骤
- 从二维数组的右上角开始查找。
- 如果当前元素等于目标值,则返回
true
。 - 如果当前元素大于目标值,则移到左边一列**(因为递增的规律,当前元素的下边的所有元素都一定大于目标值,因此往下查找不可能找到目标值,往左查找可能找到目标值)**。
- 如果当前元素小于目标值,则移到下边一行**(因为递增的规律,当前元素的左边的所有元素都一定小于目标值,因此往左查找不可能找到目标值,往下查找可能找到目标值)**。
代码实现
public boolean findNumberIn2DArray(int[][] matrix, int target)
{
//判断特殊情况
if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
{
return false;
}
//定义矩阵的行列
int rows = matrix.length, cols = matrix[0].length;
//起始遍历位置为第一行最后一列
int row = 0, col = cols - 1;
while (row < rows && col >= 0)
{
//当前值
int num = matrix[row][col];
//如果找到,返回true
if (num == target)
{
return true;
}
//如果当前值大于要找的值,列前移
else if (num > target)
{
col--;
}
//如果当前值小于要找的值,行下移
else
{
row++;
}
}
return false;
}