在二维有序数组中查找一个数

版权声明:允许转载,请注明文章出处 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;
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/Vickers_xiaowei/article/details/85916441