【C/C++练习题】二维数组中查找

举报
王建峰 发表于 2021/11/19 00:09:13 2021/11/19
【摘要】 《剑指Offer》面试题4   1 问题描述 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。     2 分析 按照二维数组元素之间的规律,选择从右上角(或者左下角)的...

《剑指Offer》面试题4

 

1 问题描述

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

 

 

2 分析

按照二维数组元素之间的规律,选择从右上角(或者左下角)的元素开始查找。如果查找值相比元素值大,排除左边数据(一行)
如果查找值相比元素值小,排除下方数据(一列)。这样在每次比较后,都可以缩小查找范围,直到最终找到目标元素。

另外,二维数组在内存上是连续存储的,可以通过数组首地址+偏移量的方式定位数组中的元素。

 

3 代码


  
  1. /*
  2. **面试题4:二维数组中的查找
  3. **题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按
  4. **照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个
  5. **整数,判断数组中是否含有该整数。
  6. */
  7. #include "iostream"
  8. using namespace std;
  9. //函数:查找指定数组
  10. //输入:matrix数组、rows行数、columns列数、number查找的数字
  11. bool Find(int* matrix, int rows, int columns, int number)
  12. {
  13. if ((matrix == nullptr) || (rows <= 0) || (columns <=0))
  14. {//判断无效参数
  15. return false;
  16. }
  17. int row = 0;
  18. int column = columns - 1;
  19. while (row < rows && column >= 0)
  20. {//在数组范围内查找
  21. if (matrix[row*columns + column] == number)
  22. {//查找到目标
  23. return true;
  24. }
  25. else if (matrix[row*columns + column] < number)
  26. {//向下继续查找
  27. row++;
  28. }
  29. else
  30. {//向左继续查找
  31. column--;
  32. }
  33. }
  34. return false;
  35. }
  36. void test01()
  37. {
  38. int matrix[][4] = {
  39. {1, 2, 8, 9},
  40. {2, 4, 9, 12},
  41. {4, 7, 10, 13},
  42. {6, 8, 11, 15}
  43. };
  44. bool ret = Find(&matrix[0][0], 4, 4, 4);
  45. cout << "result:" << ret << endl;
  46. }
  47. int main(int argc, char const *argv[])
  48. {
  49. test01();
  50. return 0;
  51. }

 

文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/feit2417/article/details/96624687

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。