剑指offer面试题:二维数组的查找

      题目:在一个二维数组中,每一行按照从左到右递增的顺序排序,每一列按照从上到下的顺序排序,输入二维数组和整数,判断是否存在。

例如下方的二维数组:
1  2  8   9
2  4  9  12
4  7 10 13
6  8 11 15

       思路:当我们看到这道题的第一反应应该是遍历这个二维数组,逐个进行查找,这样虽然可以得到结果但是时间复杂度较大,并且没有用到题目中给我们的线索,我们可以看到该二维数字是按照一定顺序排列的。我们可以把这个四行四列的二维数组看做一个4*4的方格,先找出右上角的数字,如果右上角的数字是我们要找的数字就结束,如果比要找的数字小那就排除这一列(因为右上角的数字是这一列最小的),同理,如果比要找的数字大,那么我们就排除这一行。这样一来我们会把查找的区域逐渐缩小。到最后没有找到就说明没有,反之则找到。
 

#include<stdio.h>
#include<assert.h>
bool sort(int arr[4][4],int key)
{
	assert(arr!=NULL);
	int i,j;
	i=0;
	j=3;//通过下标定位到右上角
	while(i<3&&j>0)
	{
		if(arr[i][j]==key)//找到则返回
		{
			return true;
		}
		if(arr[i][j]>key)如果比目标数字大则剔除这一列
		{
			j--;
		}
		else//比目标数字小则剔除这一行
		{
			i++;
		}
	}
	return false;
}
int main()
{
	int arr[4][4]={1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15};
	int n=sort(arr,7);
	if(n==1)
	{
		printf("存在该元素\n");
	}
	else
	{
		printf("该元素不存在\n");
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章