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

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

《剑指Offer》面试题4

 

1 问题描述

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

 

 

2 分析

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

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

 

3 代码


      /*
      **面试题4:二维数组中的查找
      **题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按
      **照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个
      **整数,判断数组中是否含有该整数。
      */
      #include "iostream"
      using namespace std;
      //函数:查找指定数组
      //输入:matrix数组、rows行数、columns列数、number查找的数字
      bool Find(int* matrix, int rows, int columns, int number)
      {
     	if ((matrix == nullptr) || (rows <= 0) || (columns <=0))
      	{//判断无效参数
     		return false;
      	}
     	int row = 0;
     	int column = columns - 1;
     	while (row < rows && column >= 0)
      	{//在数组范围内查找
     		if (matrix[row*columns + column] == number)
      		{//查找到目标
     			return true;
      		}
     		else if (matrix[row*columns + column] < number)
      		{//向下继续查找
      			row++;
      		}
     		else
      		{//向左继续查找
      			column--;
      		}
      	}
     	return false;
      }
      void test01()
      {
         int matrix[][4] = {
          	{1, 2, 8, 9},
          	{2, 4, 9, 12},
          	{4, 7, 10, 13},
          	{6, 8, 11, 15}
          };
         bool ret = Find(&matrix[0][0], 4, 4, 4);
          cout << "result:" << ret << endl;
      }
      int main(int argc, char const *argv[])
      {
     	test01();
     	return 0;
      }
  
 

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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