题目:
有一个二维数组,数组的每行从左到右是递增的,每列从上到下是递增的。在这样的数组中查找一个数字是否存在?
要求:时间复杂度小于O(N);
例:数组
1 2 3
4 5 6
7 8 9
解题思路:
首先我们肯定不能用常规的依次遍历来查找,这样做时间复杂度不满足题目要求;那么我们应该从何处下手呢?
首先我们来观察杨氏数组的特点,就是数组的每行从左到右是递增的,每列从上到下是递增的。也就是说数组的左上角的元素是最小的,右下角的元素是最大的。
这是我们可以发现右上角的元素arr[i][j]从右往左递减,从上往下递增;假如我们从右上角的元素开始与要查找的元素相比较,如果大于要查找的元素,就令i - -,如果小于要查找的元素,就令j++;直到找到要查找的元素。
程序源码:
#include<iostream>
#include<stdio.h>
#include<Windows.h>
#define COL 3
#define ROW 3
using namespace std;
bool Find_Yang(int arr[][COL], int data){
int i = 0;
int j = ROW - 1;
while (i < COL && j >= 0){
if (data > arr[i][j])
i++;
else if (data < arr[i][j])
j--;
else
return true;
}
return false;
}
void test(){
int yang[ROW][COL] = {
{1,2,3},
{4,5,6},
{7,8,9},
};
int data;
cout << "请输入要查找的数字:" << endl;
cin >> data;
if (Find_Yang(yang, data))
cout << "找到了!" << endl;
else
cout << "没有找到哦!" << endl;
}
int main(){
test();
system("pause");
return 0;
}
程序运行结果:
【程序运行环境】:VS2013