面试题4 二维数组中的查找
题目:在一个二维数组中,每一行都是按照从左到右递增的顺序排列,每一列都是按照从上到小递增的顺序排列。请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有该整数。
解法:当然我们知道通过遍历完数组是可以找到的,但这不是我们的目的。因为每一行每一列都是递增顺序的,我们可以按照对角线的方向思考。
先思考一下正对角线,如果我们取正对角线上的一个数字n,如果n比要找的数m大,那么m就落在n的位置左边或者上边,由于这两片区域有重叠区域,接下来不好找,所以我们从反对角线来思考一下问题,可能要会简单点。
从右上角,取反对角线上的第一个数n,如果要找的数m比n大,那么m在n的位置下面;如果m比n小,那么m就在n的左边。按照这个方法,慢慢地排除一行一列,从而找到那个数,或者没有这个数。算法的时间复杂度为O(n),空间复杂度为O(1)
代码:
#include<stdio.h>
#include<iostream>
using namespace std;
//在二维排序数组中找到某个数
bool findNumber(int arr[][4],int rows,int cols,int num);
int main() {
int arr[4][4] = { { 1,2,8,9},
{ 2,4,9,12},
{4,7,10,13},
{6,8,11,15} };
int num = 5;
bool isFind = findNumber(arr, 4, 4, num);
cout << "result isFind:" << isFind<<endl;
return 0;
}
bool findNumber(int arr[][4], int rows, int cols,int num) {
if (arr == nullptr || rows <= 0 || cols <= 0) {
return false;
}
bool isFind = false;
int i = 0, j = cols - 1;
while (i < rows&&j >= 0) {
if (arr[i][j] == num) {
isFind = true;
break;
}
else if (arr[i][j] > num) {
j--;
}
else {
i++;
}
}
return isFind;
}