面试题04. 二维数组中的查找
题目描述
在一个n*m的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
现有矩阵 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。
限制:
0 <= n <= 1000
0 <= m <= 1000
解题思路
emmmmm这道题没啥好说的?可以暴力也可以取巧?好吧我把它归为取巧方法......
确实很巧妙啊,这个数组的数组元素每行每列都相对有序。
以下摘自《剑指Offer》:
首先选取数组中右上角的数字。如果该数字等于要查找的数字,则查找过程结束;如果该数字大于要查找的数字,则剔除这个数字所在的列;如果该数字小于要查找的数字,则剔除该数字所在的行。
C++版本
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
if(matrix.size() == 0)
return false;
int rows = matrix.size();
int columns = matrix[0].size();
if(rows > 0 && columns > 0)
{
int row = 0;
int column = columns - 1;
while(row < rows && column >= 0)
{
if(matrix[row][column] == target)
return true;
else if(matrix[row][column] > target)
column --;
else
row ++;
}
}
return false;
}
};
Java版本
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix.length == 0)
return false;
int rows = matrix.length - 1;
int cols = matrix[0].length;
int row = 0;
int col = cols - 1;
while(row <= rows && col >= 0)
{
if(matrix[row][col] == target)
return true;
else if(matrix[row][col] > target)
col --;
else
row ++;
}
return false;
}
}
}