题目描述

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
 
思路分析:使用蛮力的话数组行列比较多的时候会很耗时。所以还是要想办法来缩小查找范围。
这个数组的定义是从左到右递增,从上到下递增,但是并不是所有在当前数字的右边的都比他大,也不是所有在当前数字下面的都比他大。
举个栗子:
1     2     7     9
2     5     8    15
8    10   13   20
 
如果随机选取一个数字的话是没有规律的。
 
1、从左上角来说,如果一个数比他大,只能是往后查找,如果一个数比他小你也不能剔除一列或者一行,右小角同理。
2、所以选择从右上角或者左下角出发来解决这个问题:(array[i][j]代表当前元素)
  二者原理相同,理解其一即可。
(1)如果是从右上角出发,如果target<array[i][j]的话,是不是说明比他大的元素就不用查找了?当前元素所在的列就可以剔除掉了。
如果target>array[i][j],是不是说明目标元素比当前元素还要大,因为是右上角,所以他这行左边的元素都比他大,那么当前行元素就可以剔除了。
 
(2)如果从左下角出发,如果target<array[i][j],说明目标元素比当前元素还要小就说明比他大的不用再查找了,所以就可以剔除一行元素了。
如果target>array[i][j],说明目标元素比当前元素要大,那么比他小的就不用再找了,就可以剔除一列。
 
贴一下代码,是按右上角出发的:
#include<iostream>
#include<vector>
using namespace std; bool Find(int target, vector<vector<int> > array) {
bool result = false;
int row = array.size();
int column = array[0].size();
int i = 0, j = column - 1;
if (!array.empty() && row > 0 && column > 0) {
//从右上角开始扫描,当前数<target小的就剔除当前行,当前数>target大的就剔除当前列
while (i < row&&j>=0) {
if (array[i][j] == target) {
//找到
return true;
}
else if (array[i][j] > target) {
j--;
}
else {
i++;
}
}
}
}
 
 

最新文章

  1. UVa OJ 175 - Keywords (关键字)
  2. 给Android程序员的六个建议
  3. hive搭建配置
  4. KDE声音服务器 arts
  5. 在List中找出最大值的两种方法
  6. N3292x IBR介绍
  7. Hadoop分布式集群搭建hadoop2.6+Ubuntu16.04
  8. 使用Aspose.Cells利用模板导出Excel(C#)
  9. [LeetCode] Student Attendance Record I 学生出勤记录之一
  10. iOS证书配置与管理
  11. MVC 微信开发获取用户OpenID
  12. 动态HTMl处理
  13. Java序列化技术即将被废除!!!
  14. Asp.Net MVC学习总结之过滤器详解(转载)
  15. Fiddler配置https
  16. Oslo 相机 App
  17. 查看CentOS系统运行了多久使用uptime命令
  18. SPOJ Distinct Substrings【后缀数组】
  19. Discuz常见大问题-如何开启和使用首页四格
  20. oracle账户密码更新

热门文章

  1. jmeter + tomcat + ant + svn +jenkins 实现持续集成测试
  2. Android 应用框架层 SQLite 源码分析
  3. mybatis 基本配置 学习总结01
  4. sklearn.preprocessing.LabelEncoder_标准化标签,将标签值统一转换成range(标签值个数-1)范围内
  5. 2.3 C++STL vector容器详解
  6. python关于openpyxl库的常用使用介绍
  7. Python之GUI用户界面Tkinter(一)
  8. MySQL — 索引
  9. 想让DBA瞬间崩溃,那就让他去做SQL性能优化
  10. RDMA相关的技术网站