当前位置: 首页 > news >正文

面试题——二维数组中的查找

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

例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。

这是前两天解决的一个问题,写出来总结一下。

递归函数如下,对于查找矩阵,递归如下算法。

对这个矩阵,从左上向右下方向查找。

0. 如果当前位置(m, n)的数据等于所求数据,查找成功。

1. 如果当前位置(m, n)的数据小于所求数据,说明(i <=m && j<=n)位置的数据均小于所求数据。淘汰。则查找(m + 1, n + 1)。

2. 如果当前位置(m, n)的数据大于所求数据,则(i >m && j>n)位置的数据均大于所求数据。淘汰。则对(i<m && j>=n)以及(i<=m&&j<n)两个矩阵递归查找。

3. 考虑情况,某个矩阵是1*n或n*1的,也就是一行或一列,那么就不要按对角线查找了,按大小遍历查找即可。

4. 需考虑矩阵行列不相等情况,比如行到了边缘,而列没有。当前数据还小于所查数据,那么淘汰调这半边即可,对剩下那半个矩阵递归查找。

时间紧,所述简略,见谅,代码附上。

#include<iostream> using namespace std; int data[100][100]; //参数:所查原始大矩阵行边界,列边界,所查矩阵块的上边界,下边界,左边界,右边界,所查数据。 int search(int bound_r, int bound_c, int left_i, int right_i, int left_j, int right_j, int find_num){ int i = 0; int j = 0; if(left_i < 0 || left_i > bound_r || right_i < 0 || right_i > bound_r || left_j < 0 || left_j > bound_c || right_i < 0 || right_i > bound_c) return 0; if(left_j == right_j){ //矩阵为一列 for(i = left_i; i <= right_i && data[i][right_j] <= find_num; i++){ if(data[i][right_j] == find_num){ cout << i << " " << right_j << endl; return 1; } } return 0; } if(left_i == right_i){ //矩阵为一列 for(j = left_j; j <= right_j && data[right_i][j] <= find_num; j++){ if(data[right_i][j] == find_num){ cout << right_i << " " << j << endl; return 1; } } return 0; } for(i = left_i, j = left_j; i <= right_i && j <= right_j; i++, j++){ //正常矩阵 if(data[i][j] == find_num){ cout << i << " " << j << endl; return 1; } else if(data[i][j] > find_num){ return search(bound_r, bound_c, left_i, i - 1, j, right_j, find_num) + search(bound_r, bound_c, i, right_i, left_j, j - 1, find_num); } } if(j <= right_j && i > right_i){ //行出界,排除一块矩阵,对另一块查 return search(bound_r, bound_c, left_i, right_i, j, right_j, find_num); } if(i <= right_i && j > right_j){ //列出界,排除一块矩阵,对另一块查 return search(bound_r, bound_c, i, right_i, left_j, right_j, find_num); } } int main(){ freopen("test.txt", "r", stdin); int i = 0; int j = 0; for(i = 0; i < 4; i++){ for(j = 0; j < 7; j++){ cin >> data[i][j]; } } search(3, 6, 0, 3, 0, 6, 17); // search(3, 3, 0, 3, 0, 3, 8); return 0; }


相关文章:

  • 使用java poi解析表格
  • 【Android】如何查看每个方法所花费的时间从而进行Performance的调优
  • docker-compose命令
  • 你还在迭代和递归吗?
  • 受欢迎的牛
  • appium自动化安装(一)
  • Template Method模板方法
  • UVA 10603 倒水问题
  • 程序员编程艺术第二十六章:基于给定的文档生成倒排索引(含源码下载)
  • Flume数据采集准备
  • 【Android】Menu不同菜单的使用介绍
  • python初识
  • Elasticsearch教程收集
  • 巧用Chrome格式化压缩后的js文件
  • 通过LoadBalancerClient获取所有服务列表的IP
  • 78. Subsets
  • css系列之关于字体的事
  • Fastjson的基本使用方法大全
  • JAVA 学习IO流
  • LeetCode算法系列_0891_子序列宽度之和
  • October CMS - 快速入门 9 Images And Galleries
  • Phpstorm怎样批量删除空行?
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • tab.js分享及浏览器兼容性问题汇总
  • 从零开始在ubuntu上搭建node开发环境
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 基于webpack 的 vue 多页架构
  • 什么软件可以剪辑音乐?
  • 数据科学 第 3 章 11 字符串处理
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​Java并发新构件之Exchanger
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #stm32驱动外设模块总结w5500模块
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #在 README.md 中生成项目目录结构
  • $.ajax()方法详解
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (七)Knockout 创建自定义绑定
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (五)网络优化与超参数选择--九五小庞
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)可以带来幸福的一本书
  • .net framework4与其client profile版本的区别
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET6 命令行启动及发布单个Exe文件
  • .py文件应该怎样打开?
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • /var/lib/dpkg/lock 锁定问题
  • [ IO.File ] FileSystemWatcher
  • [autojs]autojs开关按钮的简单使用