一 题目:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。完成一个函数,输入这样的数组和一整数,判断这个数组是否包含这个整数。
二 分析
- 如果这个二维数组是未排序的数组,那么只能通过遍历整个数组判断是否存在输入的整数;
- 如果每一行都是升序排列,那可以通过比较每一行末尾的数,首先确定需要查询的数可能出现在哪一行,然后再在那一行上做二分查找,同样的道理适合列排序;
- 如果行和列都按升序排序,可以仿照分析2中的方法,首先选取右上角的数作比较,若小于该数就向左比较,若大于该数就向下比较;
比如,要在如下的数组中查找7,按照分析3的方法,查找步骤如下:
1 | 2 | 8 | 9 |
2 | 4 | 9 | 12 |
4 | 7 | 10 | 13 |
6 | 8 | 11 | 15 |
9大于7,下一次只需要在9的左边区域查找;
1 | 2 | 8 | 9 |
2 | 4 | 9 | 12 |
4 | 7 | 10 | 13 |
6 | 8 | 11 | 15 |
8大于7,下一次只需要在9的左边区域查找;
1 | 2 | 8 | 9 |
2 | 4 | 9 | 12 |
4 | 7 | 10 | 13 |
6 | 8 | 11 | 15 |
2小于7,下一次只需要在2的下边区域查找;
1 | 2 | 8 | 9 |
2 | 4 | 9 | 12 |
4 | 7 | 10 | 13 |
6 | 8 | 11 | 15 |
4小于7,下一次只需要在2的下边区域查找;
经过5次比较后,查找到7存在。
三 实现
bool Find(int* matrix,int rows,int columns,int number) { bool found = false; if(matrix != NULL && rows > 0 && columns > 0) { int row=0; int column = columns - 1; while(row < rows && column >=0) { if(matrix[row][column] == number) { found = true; break; } else if(matrix[row][column] > number) column--; else row++; } } return found; }
四 追加研究
如果这个二维数组是n*n的方阵,那么可以考虑从左上角开始比较,沿着对角线比较。
在上面的举例中,7>1,然后比较7>4,接着比较7<10,因此知道7可能出现在第三行或者第三列,可以分别用二分查找。