问题:
给定一个二维数组,这个二维数组的每行、每列数字都是递增的,查找某个整数是否在二维数组内。
分析:
这题和堆排序有类似,查找过程中从右上方的数字开始,如果该数字比查找的数字小,那么该数字所在行可以删除,不用继续考虑;如果该数字比查找的数字大,那么该数字所在列可以删除。这样,每次执行,都会删除一行或者一列,极端情况下,执行2n次。
算法代码:
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
bool findMatrix(int *a, int value, int rows, int columns)
{
if(a == NULL || rows <=0 || columns <= 0)
{
return false;
}
int row = 0;
int column = columns - 1;
while(column >= 0 && row < rows)
{
if(a[row*columns + column] == value) //找到直接返回
return true;
else
{
if(a[row*columns + column] > value) //将所在的一列删除
column--;
else //将所在的一行删除
row++;
}
}
return false;
}
int main()
{
int a[][4] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
//int a[][1] = {{1}};
cout << findMatrix((int *)a, 15, 4, 4) <<endl;
return 0;
}
总结:
这里利用了这个二维数组特有的性质,让问题更加简化。
扩展:如何构造这个特殊的二维数组,以便于进行高效查找?