题目
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如下面的二维数组就是每行、每列都增序排序。如果在这个数组中查找数字13,则返回true;如果查找数字15,由于数组不含有该数字,则返回false。
1 2 7 10
5 8 9 11
7 13 14 17
20 25 27 30
分析
假设要查找的数字数字是13,首先我们选取数组的右上角的数字10。由于13大于10,根据题目要求数组每一行都是从左到右递增的顺序排序,所以10是第一行最大的数,因此第一行不存在比13还大的数字。于是把这一行从需要考虑的区域内剔除,之后只需分析剩下来的3行(即图中的红色圈的区域)。
在剩下的3行中,右上角的数字为11。同样11小于13,因此11所在的行应该剔除,之后剩下只需分析两行(即图中的红色圈的区域)。
在剩下的2行中,右上角的数字为17。17大于13,根据题目要求数组的每一列都是从上到下递增顺序排列,所以17是第四列最小的数,因此第四列不存在比13还小的数字。于是把这一列剔除,之后剩下只需分析2行3列(即图中红色圈的区域)。
在剩下的数字中,右上角的数字为14,14大于13,同理14所在列应该剔除,之后剩下2行2列(即图中红色圈的区域)。
代码
#include<stdio.h>
/**
*matrix 输入二维数组的地址
rows 二维数组的行数
columns 二维数组的列数
number 要查找的数
**/
bool find(int *matrix, int rows, int columns, int number) {
bool result = false;
//rows = 行,column = 列
//检测函数的入口参数是否合法
if(matrix != NULL && columns >0 && rows > 0) {
//定位右上角的数组元素
int rowtemp = 0;
int columntemp = columns - 1;
//当查找是的行数小于总的行数和查找的列数大于等0,则在循环查找,直到查找到为止。
while(rowtemp < rows && columntemp >= 0 ) {
//如果右上角的数大于查找的数,剔除右上角的数所在列
if( matrix[rowtemp * columns + columntemp] > number) {
printf(" > --> %d\n", matrix[rowtemp * columns + columntemp]);
columntemp--;
//如果右上角的数小于查找的数,剔除右上角的数所在的行
} else if ( matrix[rowtemp * columns + columntemp] < number) {
printf(" < --> %d\n", matrix[rowtemp * columns + columntemp]);
rowtemp++;
//如果右上角的数等于查找的数
} else if ( matrix[rowtemp * columns + columntemp] == number) {
printf(" == --> %d\n", matrix[rowtemp * columns + columntemp]);
result = true;
//如果找到则退出while循环
break;
}
}
}
return result;
}
void main() {
int a[4][4] = { {1,2,7,10},{5,8,9,11},{7,13,14,17},{20,25,27,30}};
printf("find result = %d\n",find(&a[0][0],4,4,13));
}