题目描述

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

 

来分析下,假设在数组中随便找一个数字 inner_number 来与 target 进行比较,如果 target > inner_number,那么我们需要在数组中剔除掉 inner_number 所在行的左边的数、 inner_number 所在列的上边的数以及左上部分的数;同理,如果 target < inner_number,那么我们需要在数组中剔除掉 inner_number 所在行的右边的数、 inner_number 所在列的下边的数以及右下部分的数。

小结一下,

如果 target 大了,那么剔除左上部分的数字

如果 target 小了,那么剔除右下部分的数字

这样一来,要表示数组中剩下的数字就比较蛋疼。如果可以一次剔除掉一行或者一列那就比较爽了,那么有没有这样的办法呢?当然,在一开始将 target 与右上角的数来比较,就可以做到一次剔除一行或者一列。同理,一开始将 target 与左下角的数比较也可以。

Why? 对于右上角的数字,如果 target 大了,那么就剔除左上部分的数字,上面没有东西了,所以就变成剔除该数字所在的行了;如果 target 小了,那么就剔除右下部分的数字,右边没有东西了,所以就变成剔除该数字所在的列了。左下角同理。

但是,左上角的数字与右下角的数字不可以。按左上角的数字来举例。如果 target 大了,那么剔除左上部分,特么左边与上边都没了,就只能剔除自己,这也太蛋疼了…当然 target 小了是好办,一下子把数字都剔除光了,返回 false 。

来看代码:

class Solution {
public:
bool Find(vector<vector<int> > array,int target) { int maxRow = array.size() - 1;
int minCol = 0; int curRow = 0;
int curCol = array[0].size() - 1; // 从右上角开始查询,一次删除一行或者一列
while (curRow <= maxRow && curCol >= minCol) {
if (array[curRow][curCol] == target) {
return true;
} else if (array[curRow][curCol] < target) {
curRow++;
} else {
curCol--;
}
} return false;
}
};

顺带写个递归版本玩玩:

class Solution {
public:
bool Find(vector<vector<int> > array,int target) {
int maxRow = array.size() - 1;
int minCol = 0; int curRow = 0;
int curCol = array[0].size() - 1; return find_helper(array, target, curRow, curCol, maxRow, minCol);
} private:
bool find_helper(vector<vector<int> > &array, const int target, int &curRow, int &curCol, const int maxRow, const int minCol) {
if (curRow > maxRow || curCol < minCol) {
return false;
} if (array[curRow][curCol] == target){
return true;
} else if (array[curRow][curCol] < target) {
return find_helper(array, target, ++curRow, curCol, maxRow, minCol);
} else {
return find_helper(array, target, curRow, --curCol, maxRow, minCol);
}
} };

[NewCoder 3] 二维数组中的查找的更多相关文章

  1. 剑指Offer面试题:2.二维数组中的查找

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

  2. 剑指Offer:面试题3——二维数组中的查找(java实现)

    问题描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:取数组中的元素与 ...

  3. 【面试题003】c数组做为参数退化的问题,二维数组中的查找

    [面试题003]c数组做为参数退化的问题,二维数组中的查找  一,c数组做为参数退化的问题 1.c/c++没有记录数组的大小,因此用指针访问数组中的元素的时候,我们要确保没有超过数组的边界, 通过下面 ...

  4. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  5. 《剑指Offer》面试题-二维数组中的查找

    题目1384:二维数组中的查找 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7318 解决:1418 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到 ...

  6. 《剑指offer》— JavaScript(1)二维数组中的查找

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

  7. 剑指offfer:二维数组中的查找

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

  8. C#版 - 小红书后台开发面试题: 二维数组中的查找

    二维数组中的查找 热度指数:24274 时间限制:1秒 空间限制:32768K 本题知识点: 查找 ​ 在线提交网址: http://www.nowcoder.com/practice/abc3fe2 ...

  9. 二维数组中的查找问题--剑指offer面试题3

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

随机推荐

  1. cocos jsb工程转html 工程

    1 CCBoot.js prepare方法:注掉下面这行,先加载moduleConfig中的脚本后加载user脚本 //newJsList = newJsList.concat(jsList); // ...

  2. 2019.01.23 hdu3377 Plan(轮廓线dp)

    传送门 题意简述:给一个n*m的带权矩阵,求从左上角走到右下角的最大分数,每个格子只能经过最多一次,n,m≤9n,m\le9n,m≤9. 思路: 考虑轮廓线dpdpdp,但这道题并没有出现回路的限制因 ...

  3. 2018.10.25 洛谷P4187 [USACO18JAN]Stamp Painting(计数dp)

    传送门 其实本来想做组合数学的2333. 谁知道是道dpdpdp. 唉只能顺手做了 还是用真难则反的思想. 这题我们倒着考虑,只需要求出不合法方案数就行了. 这个显然是随便dpdpdp的. f[i]f ...

  4. Eclipse创建Dynamic Web部署

    Eclipse创建Dynamic Web部署 http://blog.csdn.net/sweblish/article/details/6686046 Eclipse3.x中热部署项目,启动错误问题 ...

  5. vi三种模式的切换

    基础上vi/vim共分为三种模式,分别是命令模式,输入模式和底线命令模式. 一.命令模式 用户刚刚启动vi/vim,便进入了命令模式. 在此状态下敲击键盘动作会被vim识别为命令,而非输入字符.比如我 ...

  6. SQL语句关联查询

    一:连接类型: 关联查询:只有存在关联的表才能关联查询,完全独立的表之间无法关联 1.关联的类型:自关联,左关联,右关联,全关联(full join)两张表都是主表 2.关联的表:两张以上,以一张(或 ...

  7. java常用设计模式十:模板模式

    一.定义 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 如果上面的话不好理解,请看下面的例子 二.示例 1)定义一个模 ...

  8. c#中委托与事件

    参考:http://www.tracefact.net/tech/009.html 张子阳:http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/9 ...

  9. centos7,配置nginx服务器

    安装准备 首先由于nginx的一些模块依赖一些lib库,所以在安装nginx之前,必须先安装这些lib库,这些依赖库主要有g++.gcc.openssl-devel.pcre-devel和zlib-d ...

  10. Arria10中PHY的时钟线结构

    发送器时钟网络由发送器PLL到发送器通道,它为发送器提供两种时钟 高速串行时钟——串化器的高速时钟 低速并行时钟——串化器和PCS的低速时钟 在绑定通道模式,串行和并行时钟都是由发送器的PLL提供给发 ...