题目描述

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

 

来分析下,假设在数组中随便找一个数字 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. L与_T

    https://www.cnblogs.com/xxn-180727/p/9378519.html _T( ) 是一个适配的宏,当工程采用Unicode字符时 _T()就是 L,会将多字节的字符串转化 ...

  2. IOS初级:观察者

    //为一个编辑框myField添加观察者,观察当编辑框文字改变时通知 //方法textChange是通知发生是要做的事情 [[NSNotificationCenter defaultCenter] a ...

  3. syslog、日志服务器安装、卸载详解、如何安装和卸载EventLog Analyzer

  4. unity在一个对象上挂多个一样的脚本怎么获取

    使用GetComponents获取,存到一个该类的数组里

  5. RHEL6.3下挂载ISO并配置安装软件包(转)

    1.将RHEL6.3的ISO镜像上传至RHEL6.3服务器上 2.挂载ISO镜像 一般将镜像文件挂载到/mnt/XXX下,所以首先创建挂载文件夹: # mkdir /mnt/cdrom 挂载(我将上传 ...

  6. 2019.01.26 codeforces 1096G. Lucky Tickets(生成函数)

    传送门 题意简述:现在有一些号码由000~999中的某些数字组成(会给出),号码总长度为nnn,问有多少个号码满足前n2\frac n22n​个数码的和等于后n2\frac n22n​个数码的和(保证 ...

  7. 2018.06.27"Shortest" pair of paths(费用流)

    "Shortest" pair of paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1589 A ...

  8. C++中string的使用

    概述 这篇博文为了记录C++中string的使用,用到一点补充一点. 预备 使用string之前需要包含头文件 #include<iostream> #include<string& ...

  9. Codeforces Round #541 (Div. 2) D 并查集 + 拓扑排序

    https://codeforces.com/contest/1131/problem/D 题意 给你一个n*m二维偏序表,代表x[i]和y[j]的大小关系,根据表构造大小分别为n,m的x[],y[] ...

  10. maven打包某个分支的包

    maven打某个分支的包命令: mvn clean install -Dmaven.test.skip=true -Pdevelop