写在前面:C语言还未入门,考虑问题还不全面,纯为记录自己学习这本书的过程
题目:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如:输入二维数组,在这个数组中查找数字7,则返回true;如果查找数字5,由于数组中不含有数字5,则返回false。
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
思想:
(从右上角元素开始可以视为二分查找树)
如果目标数字小于右上角元素,而右上角元素又为该列最小元素,所以可以去掉最右列;
如果目标数字大于右上角元素,而右上角元素为该行最大元素,所以可以去掉第一行元素。
这样每一步都可以缩小范围,直到找到目标数字,或者查找范围为空。
代码:
bool findNumberIn2DArray(int** matrix, int matrixSize, int* matrixColSize, int target){
int row = 0; //行数,*matrixColSize为总列数,matrixSize为总行数
int col = *matrixColSize - 1; //从右上角开始
if (matrixSize == 0 || *matrixColSize == 0) //空的
return false;
while(row < matrixSize && col >= 0) //还在矩阵里,没有超出范围
{
if(matrix[row][col] == target) //找到了
return true;
else if(matrix[row][col] > target) //如果右上角大于target则去掉该列
col--; //列数减一
else //如果小于则去掉该行
row++;
}
return false;
}