//*******************************二维数组中查找一个数**********************************
//题目要求:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的
// 顺序排序,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
// 找到则返回true,没找到则返回false
//题目扩展:如果在找到之后还要返回它的地址,如果在数组中有多个相同的值,则需要问清楚面试官是把所有
// 的值都返回还是第一个找到的数,或者是返回第二个找到的。
//NOTE:(1)如何传二维数组作为函数参数:二维数组可以当作一维数组传给函数
// (2)如何把二维数组的下标转换为一维数组下标的格式:
// 对于n*n的二维数组arr[当前行数][当前列数]=arr[当前行数*n+当前列数]
// arr[0][3]=arr[0*4+3]=arr[3]
// arr[1][3]=arr[1*4+3]=arr[7]
// arr[2][2]=arr[2*4+2]=arr[10]
//解题思路:从右上角开始找,如果比key值大,则直接忽略掉这一列,从前一行再找,当找到的某一列的第一个数
// 比key值小的时候,就要从下一行找
#include<iostream>
using namespace std;
bool FindKey(int *arr, int row, int col, int key)
{
if (arr != NULL && row > 0 && col > 0)
{
int newrow = 0;
int newcol = col - 1;
//判断进入循环的条件在书上是做了继续优化的,但是对于基础不好的,我还是建议做这种比较保险的
while (newrow >= 0 && newcol >= 0 && newrow < row && newcol < col)
{
if (arr[newrow*col + newcol]>key)
{
--newcol;
}
else if (arr[newrow*col + newcol] < key)
{
++newrow;
}
else
{
return true;
}
}
}
return false;
}
int main()
{
int arr[4][4] = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 }, { 6, 8, 11, 15 } };
//bool ret=FindKey((int*)arr, 4, 4, 7);
bool ret = FindKey((int*)arr, 4, 4, 16);
cout << ret << endl;
return 0;
}

错误!!一些基本的错误,这些错误一定要避免,数组要判空,传入的参数也要判断是否符合我们想要的
//bool FindKey(int arr[], int row, int col, int key)
//{
// //错误3::未判断数组是否为空,col和row是否是我们需要的,比如row若为-1就是错的
// int newrow = 0;
//
// //错误2:3不是已知的,而是算出来的
// int newcol = 3;
//
// //错误1:刚进来时newrow=0,不满足条件,直接返回false,太粗心
// while (newrow > 0 && newcol > 0 && newrow < row && newcol < col)
// {
// if (arr[newrow*col + newcol]>key)
// {
// --newcol;
// }
// else if (arr[newrow*col + newcol] < key)
// {
// ++newrow;
// }
// else
// {
// return true;
// }
// }
// return false;
//}
