二维数组中的查找

Posted wanglelelihuanhuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二维数组中的查找相关的知识,希望对你有一定的参考价值。

题目:在一个二维数组中,每一行都按从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

例如下面的二维数组就是每行、每列都递增的数组。如果在这个数组中查找数字7,则返回true;如果在这个数组中查找数字13,则返回false。

思路:1、选取数组右上角的数字4。由于9大于7,并且9是第4列第一个数字,所以7不可能在9所在的列。

           2、接下来分析剩下的三列,在剩下的矩阵中,右上角的数字8同样大于7,所以7也不可能在8所在的列,剔除该列。

           3、接下来分析剩下的两列,右上角的数字2小于7,所以7可能在2的下边。剔除2所在的行。

           4、接下来分析剩下的三行两列,右上角数字4小于7,剔除4所在的行。

           5、在剩下的两行两列中,右上角数字7刚好是要找的数字。

#include<iostream>
#include<assert.h>
using namespace std;

bool Find(int arr[][4], int rows, int cols, int number)

	assert(arr);
	if (rows > 0 && cols > 0)
	
		//选取数组右上角的数字
		int row = 0; 
		int col = cols - 1;
		while (row < rows && col >= 0)
		
			if (arr[row][col] == number)  //如果该数字等于要查找的数字,返回true
			
				return true;
			
			else if (arr[row][col] > number)//如果该数字大于要查找的数字,剔除该数字所在的列
			
				--col;
			
			else //如果该数字小于要查找的数字,剔除该数字所在的行
			
				++row;
			
		
	
	return false;

int main()

	int arr[][4] =   1, 2, 8, 9 ,  2, 4, 9, 12 ,  4, 7, 10, 13 ,  6, 8, 11, 15 ;
	bool ret=Find(arr,4,4,0);
	printf("%d\\n", ret);
	return 0;


 

同样,也可以选取左下角的数字。但是不能选取左上角或右下角的数字。以左上角的数字1为例,由于1 小于7,7应该在1的右边或者下边,我们不能剔除1所在的列也不能剔除1所在的行,这样我们不能缩小范围查找。


 

以上是关于二维数组中的查找的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer:二维数组中的查找

3-二维数组中的查找

二维数组中的查找

剑指Offer(书):二维数组中的查找

查找有序二维数组中的元素

二维数组中的查找