剑指0ffer面试题3:二维数组中的查找

//*******************************二维数组中查找一个数**********************************
//题目要求:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的
//          顺序排序,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
//          找到则返回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;
//}

害羞下面给出解题思路的示意图:
 
  






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值