二维数组中的查找

来源:互联网 发布:linux rpm 安装目录 编辑:程序博客网 时间:2024/06/05 03:50

题目:在一个二维数组中,每一行都按从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

例如下面的二维数组就是每行、每列都递增的数组。如果在这个数组中查找数字7,则返回true;如果在这个数组中查找数字13,则返回false。

思路:1、选取数组右上角的数字4。由于9大于7,并且9是第4列第一个数字,所以7不可能在9所在的列。

           2、接下来分析剩下的三列,在剩下的矩阵中,右上角的数字8同样大于7,所以7也不可能在8所在的列,剔除该列。

           3、接下来分析剩下的两列,右上角的数字2小于7,所以7可能在2的下边。剔除2所在的行。

           4、接下来分析剩下的三行两列,右上角数字4小于7,剔除4所在的行。

           5、在剩下的两行两列中,右上角数字7刚好是要找的数字。

#include<iostream>#include<assert.h>using namespace std;bool Find(int arr[][4], int rows, int cols, int number){assert(arr);if (rows > 0 && cols > 0){//选取数组右上角的数字int row = 0; int col = cols - 1;while (row < rows && col >= 0){if (arr[row][col] == number)  //如果该数字等于要查找的数字,返回true{return true;}else if (arr[row][col] > number)//如果该数字大于要查找的数字,剔除该数字所在的列{--col;}else //如果该数字小于要查找的数字,剔除该数字所在的行{++row;}}}return false;}int main(){int arr[][4] = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 }, { 6, 8, 11, 15 }};bool ret=Find(arr,4,4,0);printf("%d\n", ret);return 0;}


 

同样,也可以选取左下角的数字。但是不能选取左上角或右下角的数字。以左上角的数字1为例,由于1 小于7,7应该在1的右边或者下边,我们不能剔除1所在的列也不能剔除1所在的行,这样我们不能缩小范围查找。


 

0 0
原创粉丝点击