剑指offer 3 -二维数组中的查找

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

解题思路:从二维数组的右上角的元素开始判断,因为此元素是它所在行的最大数,是它所在的列的最小数。如果它等于要查找的数字,则查找过程结束。如果它大于要查找的数字,则可以排除它所在的列。如果它小于要查找的数字,则可排除它所在的行。这样如果要查找的数字不在数组的右上角,则每次判断都可以排除一行或一列以缩小查找范围,直到找到要查找的数字,或者查找范围为空。

	#include <iostream>
	using namespace std;

	bool find(int *matrix, int cols, int rows, int number)  //强制转化为一维数组  
	{
		bool found = false;

		if (  matrix!=NULL  &&  cols>0  &&  rows>0 )
		{
			int row = 0;
			int col = cols-1;

			while(row<rows && col >=0)
			{
				if ( matrix[row*cols+col] == number )
				{
					  found = true;
					  break;
				}
				else  if ( matrix[row*cols+col] > number )
					  col--;
			   else 
					  row++;;
			}
		}
	
		return found;

	}

	void test1()    // 要查找的数在数组中
	{
		int a[][4] =  {  {1  ,2  ,8 , 9  }, { 2 , 4  ,9  ,12  }, {  4 , 7 , 10 , 13  },{ 6 , 8 , 11 , 15  }  };
		cout<<"test1   :   "<<find(   (int *) a  ,4 , 4 ,7)<<endl;
	}

	void test2()    // 要查找的数不在数组中
	{
		int a[][4] =  {  {1  ,2  ,8 , 9  }, { 2 , 4  ,9  ,12  }, {  4 , 7 , 10 , 13  },{ 6 , 8 , 11 , 15  }  };
		cout<<"test2   :   "<<find(   (int *) a  ,4 , 4 ,5)<<endl;
	}

	void test3()    //空指针
	{
		cout<<"test3   :   "<<find(   NULL  ,4 , 4 ,5)<<endl;
	}

	void test4()  // 要查找的数是数组中最小的数字
	{
		int a[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
		cout<<"test4   :   "<<find(   (int *) a  ,4 , 4 ,1)<<endl;
	}

	void test5()		// 要查找的数是数组中最大的数字
	{
		int a[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
			cout<<"test5   :   "<<find(   (int *) a  ,4 , 4 ,15)<<endl;
	}

	void test6()	   // 要查找的数比数组中最小的数字还小
	{
		int a[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
   		cout<<"test6   :   "<<find(   (int *) a  ,4 , 4 ,0)<<endl;
	}

	void test7()    // 要查找的数比数组中最大的数字还大
	{
		int a[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
 		cout<<"test7   :   "<<find(   (int *) a  ,4 , 4 ,16)<<endl;
	}

	void main()
	{
		test1();
		test2();
		test3();
		test4();
		test5();
		test6();
		test7();
	
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值