在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
// c++
#include <vector>
using namespace std;
class Solution
{
public:
bool findNumberIn2DArray(vector<vector<int>> &matrix, int target)
{
if (matrix.empty())
{
return false;
}
int rows = matrix.size();
int cols = matrix[0].size();
int row = 0;
int col = cols - 1;
while (row < rows && col >= 0)
{
if (target == matrix[row][col])
{
return true;
}
if (target > matrix[row][col])
{
row++;
}
else
{
col--;
}
}
return false;
}
};
注意点:
- 使用vector需要include <vector>并using namespace std;
- matrix.size()可以得到二维数组的行数,在行数不为0(也就是数组非空)的时候,可以用matrix[0].size()得到列数(如果数组为空,那么matrix[0]会报错)。
- 用删削二维数组的方法缩小范围,定位目标。
// java
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if (matrix.length == 0) {
return false;
}
int rows = matrix.length;
int cols = matrix[0].length;
int row = 0;
int col = cols - 1;
while (row < rows && col >= 0) {
if (target == matrix[row][col]) {
return true;
}
if (target > matrix[row][col]) {
row++;
} else {
col--;
}
}
return false;
}
}
注意点:
- java代码和c++代码几乎一样,但是运行速度快很多,空间占用更大。
# python
class Solution:
def findNumberIn2DArray(self, matrix: list[list[int]], target: int) -> bool:
if len(matrix) == 0: return False
rows = len(matrix)
cols = len(matrix[0])
row = 0
col = cols - 1
while row < rows and col >= 0:
if matrix[row][col] > target: col -= 1
elif matrix[row][col] < target: row += 1
else: return True
return False
注意点:
- if分支结构中,将更可能出现的情况放在前面,可以减少运行时间。