在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列按扎从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断这个数组中是否含有这个整数。
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
给定 target = 5, 返回 true
给定 target = 20, 返回 false
// 暴力查找
bool findNumberIn2DArray(std::vector<std::vector<int>>& matrix, int target){
int cols = matrix[0].size(); // 列数
int rows = matrix.size(); // 行数
if (cols == 0 || rows == 0){
return false;
}
for (int i=0;i<rows;i++){
for (int j=0;j<cols;j++){
if (target == matrix[i][j]){
return true;
}
}
}
return false;
// 线性查找 右上角开始查找
bool findNumberIn2DArray_2(std::vector<std::vector<int>>& matrix, int target){
int cols = matrix[0].size(); // 列数
int rows = matrix.size(); // 行数
if (cols == 0 || rows == 0){
return false;
}
// 从 0 行 cols -1 列开始查找
int row = 0;
int column = cols - 1;
while (row < rows && column >= 0){
// num 表示当前值
int num = matrix[row][column];
if (num == target){
// 如果找到,直接返回
return true;
}else if ( num > target){
// 到前面查找
column--;
} else{
// 到下面查找
row++;
}
}
return false;
}
int main(int argc,char **argv)
{
std::vector<std::vector<int>> matrix = {{1, 4, 7, 11, 15}, {2, 5, 8, 12, 19}, {10, 13, 14, 17, 24}, {18, 21, 23, 26, 30}};
bool res = findNumberIn2DArray_2(matrix, 10);
if (res){
std::cout << rs << std::endl;
}
return 0;
}