题目描述:

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

输入参数:target(查找值) array(二维数组)

解题思路:

1、python代码

python实现比较简单,使用for in循环取出数组的每行i,然后使用in操作符判断target是否在行i中

 # -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
for i in array:
if target in i:
return True
return False

2、java代码

我们先看一个符合题目要求的数组

数组特点:每行元素满足从左向右增大,每列元素满足自上而下增大

同行不同列的数值存在确定的大小关系,同列不同行的数值存在确定的大小关系,数值减小的方向为:向上或向左(数值增大的方向:向下或向右)

需要注意,不同行不同列的数据间并无确定的大小关系。例如:a[1][0]>a[0][0],但是a[1][0]<a[0][2]。

考虑到数组的最后一行每个元素均为所在列的最大值,如果其小于要搜索的值,那可以直接忽略该列及其之前列的所有元素。

算法(递归):

m:行数  n:列数

(1)遍历最后一行(rowindex=m-1),找到第一个大于target的元素,存储其列索引colindex

(2)向上搜索:find(rowindex,colindex,"up",target,array)

(2)递归

  a.当前操作为向上搜索(direction='up'):

    如果rowindex==0:已经搜索至第一行,无解,返回false

    否则,rowindex-=1

  b.当前操作为向右搜索(direction='right'):

    如果colindex==n-1:已经搜索至最后一列,无解,返回false

    否则,colindex+=1

  a.如果array[rowindex][colindex]==target:返回true

b.如果array[rowindex][colindex]>target:向上搜索find(rowindex,colindex,"up",target,array)  

  c.如果array[rowindex][colindex]<target:向右搜索find(rowindex,colindex,"right",target,array) 

按照如上算法和数组,举例说明,搜索元素12步骤如下:

(1)m=4,n=4.最后一行第一个大于12的元素为13,存储其行列索引,rowindex=3,colindex=2

(根据数值大小排列的特点,可以排除掉第一列和第二列的所有元素)

(2)向上搜索:find(rowindex=3,colindex=2,direction="up",target=11,array)

(3)递归:

向上搜索:rowindex=2,colindex=2,10<12:向右搜索

向右搜索:rowindex=2,colindex=3,13>12:向上搜索

向上搜索:rowindex=1,colindex=3,12=12:停止搜索,返回true

 代码如下:

 public class Solution {
public boolean Find(int target, int [][] array) {
int m=array.length;
int n=array[0].length;
int colindex=-1;
int rowindex=m-1;
for(int i=0;i<n;i++){
if(array[m-1][i]>target){
colindex=i;
break;
}
else if (array[m-1][i]==target){
return true;
}
}
if(colindex==-1){
return false;
}
else{
return find(rowindex,colindex,"up",target,array);
}
} public boolean find(int rowindex,int colindex,String direction,int target, int [][] array){
if(direction=="up"){
if(rowindex==0){
return false;
}
else{
rowindex--;
}
}
else if(direction=="right"){
if(colindex==array[0].length-1){
return false;
}
else{
colindex++;
}
}
if(array[rowindex][colindex]<target){
return find(rowindex,colindex,"right",target,array);
}
else if(array[rowindex][colindex]>target){
return find(rowindex,colindex,"up",target,array);
}
else{
return true;
}
}
//测试代码
// public static void main(String[]args){
// int array1[][]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
// Solution sol=new Solution();
// boolean a=sol.Find(14,array1);
// System.out.println(a);
// }
}

二维数组中的查找——牛客剑指offer的更多相关文章

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

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

  2. 剑指offer【01】- 二维数组中的查找(Java)

    在经历了春招各大公司的笔试题和面试官的血虐之后,决定要刷一些算法题了,不然连面试机会都没有. 而应对笔试和面试,比较出名的就是剑指offer的题目和LeetCode的题目了.剑指offer应对面试中的 ...

  3. 【Java】 剑指offer(3) 二维数组中的查找

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上 ...

  4. 【剑指offer】04A二维数组中的查找,C++实现

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

  5. 剑指Offer(一):二维数组中的查找

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

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

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

  7. [剑指Offer]5.二维数组中的查找

    题目 在一个二维数组中,每一行都依照从左到右递增的顺序排序,每一列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个二维数组和一个整数.推断数组中是否含有该整数. 思路 [算法系列之三十三]杨 ...

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

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

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

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

随机推荐

  1. 「UVA12293」 Box Game

    题目链接 戳我 \(Solution\) 这道题第一眼看样例,猜了个结论偶数\(Alice\)赢,否则\(Bob\)赢,打了一发,交了上去果不其然的\(wa\)了,第二次猜\(2\)的幂次方\(Ali ...

  2. Mui 底部导航切换

    1.建好子模板目录 2.导航代码 <nav class="mui-bar mui-bar-tab"> <a id="defaultTab" c ...

  3. 如何安装Vscode软件及设置成中文界面?

    最新小编开始研究前端,想写点东东玩,要想开始首先就要安装工具,写前端有好几个工具,安装推荐开源的vscode,第一次安装是英文版的,如何修改成中文版,也是很简单的,跟随小编一起来安装设置工具吧. 方法 ...

  4. 【导航】JennyHui 老白兔记录贴

    英语控 TED X - > 笔记 程序媛 2019-08-24 Java学习路径规划 思考记录 2018-08-24 常见的工作思考方式 浪费时间 百家讲坛 开卷八分钟

  5. LC 889. Construct Binary Tree from Preorder and Postorder Traversal

    Return any binary tree that matches the given preorder and postorder traversals. Values in the trave ...

  6. TortoiseGit的安装

    运行TortoiseGit-1.7.7.0-32bit.msi, 如下图 点击Next, 下一步 点击Next, 下一步 选择ssh客户端, 使用默认, 点击Next, 下一步 选择安装路径, 点击N ...

  7. IIS asp.net 中出现未能加载文件或程序集“System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或它的某一个依赖项。系统找不到指定的文件。

    分析器错误消息: 未能加载文件或程序集“System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或 ...

  8. python接口自动化框架搭建

    一.在搭建接口自动化测试框架前,我觉得先需要想明白以下几点: ① 目前情况下,绝大部分接口协议是http,所以需要对http协议有个基本的了解,如:http协议请求.响应由哪些部分组成,常用的meth ...

  9. idea中git远程版本回退

    idea中git远程版本回退 2017年10月15日 15:25:36 gomeplus 阅读数:19313 工作中遇到git远程仓库需要回退到历史版本的问题,根据网上的搜索结果结合自己的实践,整理了 ...

  10. Qt 之水平/垂直布局(QBoxLayout、QHBoxLayout、QVBoxLayout)

    简述QBoxLayout可以在水平方向或垂直方向上排列控件,由QHBoxLayout.QVBoxLayout所继承. QHBoxLayout:水平布局,在水平方向上排列控件,即:左右排列. QVBox ...