版权声明:允许转载,请注明文章出处 https://blog.csdn.net/Vickers_xiaowei/article/details/85916441
有一个二维数组,数组的每行从左到右是递增的,每列从上到下是递增的。在这样的数组中查找一个数字是否存在, 时间复杂度小于O(N)。
思路分析:
我们知道一维有序数组的二分查找,那么二维数组是不是也可以用二分查找呢?
这里涉及到时间复杂度不能超过O(N),不能一个一个对比查找。观察可知,数组第一行最右边的数,比这一行的每一个数都大,比这一列的每一个数都小;这个数就类似于一维数组的中值,我们就可以通过与这个数进行比较,排除一半的数。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<Windows.h>
int search_num(int arr[3][3], int key, int row, int list)
{
//由最右上角的数字开始与key进行对比
int i = 0;//行标
int j = list - 1;//列标
while ((i < row) && (j >= 0))
{
if (key>arr[i][j])
i++;
else if (key < arr[i][j])
j--;
else
return 1;
}
return 0;
}
int main()
{
int ret = 0;
int arr[3][3] = { { 1, 2, 3 }, { 2, 3, 4 }, { 3, 4, 5 } };
int key = 4;
ret = search_num(arr, key, 3, 3);
if (ret == 1)
printf("找到了\n");
else
printf("没找到\n");
system("pause");
return 0;
}