在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
分析:二维数组如:
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
我们可以从顶角开始,如从右上角开始:
1、如果这个数等于9,就退出。
2、如果这个数大于9,那就意味着它只会出现在第二、三、四行,接下来再从第二行右上角的数开始排。
3、如果这个数小于9,那就意味着它只会出现在第一、二、三列,接下来再从第三列右上角的数开始排。
这样依次下去缩小范围,就能确定是否有该数。当只剩下一个数时,如果最后一个数不等于该整数,则不存在。
代码如下:
-
#include "../common.h" bool find(const int data[4][4], int rows, int columns, int number) { if(data == nullptr || rows < 0 || columns < 0) { return false; } int row = 0; int column = columns - 1; while(row < rows && column >= 0) { if(data[row][column] == number) { return true; } else if(data[row][column] < number) //number在下面 { ++row; } else //在左边 { --column; } } return false; } int main(int argc, char *argv[]) { int data[4][4] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}}; if(find(data,4,4,7) != false) { printf("7 in data ... \n"); } else { printf("7 not in data ... \n"); } if(find(data,4,4,5) != false) { printf("5 in data ... \n"); } else { printf("5 not in data ... \n"); } }
为了方便填充数字,这里把数组的行列写死了,并不影响理解该算法。
结果如下:
7 in data ...
5 not in data ...