二维数组中的查找——牛客剑指offer
题目描述:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
输入参数: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的更多相关文章
- C#版 - 小红书后台开发面试题: 二维数组中的查找
二维数组中的查找 热度指数:24274 时间限制:1秒 空间限制:32768K 本题知识点: 查找 在线提交网址: http://www.nowcoder.com/practice/abc3fe2 ...
- 剑指offer【01】- 二维数组中的查找(Java)
在经历了春招各大公司的笔试题和面试官的血虐之后,决定要刷一些算法题了,不然连面试机会都没有. 而应对笔试和面试,比较出名的就是剑指offer的题目和LeetCode的题目了.剑指offer应对面试中的 ...
- 【Java】 剑指offer(3) 二维数组中的查找
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上 ...
- 【剑指offer】04A二维数组中的查找,C++实现
1.题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数数组和一个整数,判断数组中是否含有该整数. 2.思路 首先选取数 ...
- 剑指Offer(一):二维数组中的查找
一.前言 刷题平台:牛客网 二.题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整 ...
- 剑指Offer面试题:2.二维数组中的查找
一.题目:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- [剑指Offer]5.二维数组中的查找
题目 在一个二维数组中,每一行都依照从左到右递增的顺序排序,每一列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个二维数组和一个整数.推断数组中是否含有该整数. 思路 [算法系列之三十三]杨 ...
- 剑指Offer:面试题3——二维数组中的查找(java实现)
问题描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:取数组中的元素与 ...
- 【面试题003】c数组做为参数退化的问题,二维数组中的查找
[面试题003]c数组做为参数退化的问题,二维数组中的查找 一,c数组做为参数退化的问题 1.c/c++没有记录数组的大小,因此用指针访问数组中的元素的时候,我们要确保没有超过数组的边界, 通过下面 ...
随机推荐
- go面试题
1)解释什么是GO? GO是一种开源编程语言,可以轻松构建简单.可靠和高效的软件.程序是从包中构建的,其属性允许有效地管理依赖关系. 2)GO中的语法是什么? GO中的语法遵循Extended Bac ...
- 如何使用python将指定文件里的数据读取到字典里
list_dict_all = [] #创建一个空列表,全局变量,用来存放字典def AddtoDict(str_1): # 定义一个函数,功能:把文件里面的内容添加到字典中 list_str1 = ...
- 爬取百度网盘资源报user is not authorized, hitcode:119
爬取百度网盘资源报user is not authorized, hitcode:119 一.总结 一句话总结: 可能是百度网盘禁止非客户端环境下载大文件,所以将请求头改为客户端:'User-Agen ...
- Java-GC 垃圾收集算法
程序计数器.虚拟机栈.本地方法栈随线程而生,随线程而灭. 栈帧随着方法的开始而入栈,随着方法的结束而出栈. 这几个区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收的问题,因为方法结束 ...
- is幻梦 Linux命令之文件和目录操作命令(二)——查看文件内容cat、more、less、tail、head
一.cat命令 用法:cat [选项][文件] 1.主要用来查看文件内容 2.-n 在文件内容的每一行上加上行号 3.再不加任何选项和文件名的时候,将标准输入的内容复制到标准输出 这个时候一般用于重定 ...
- TortoiseSvn客户端介绍
TortoiseSVN 是svn版本控制系统的一个免费开源客户端,它是svn版本控制的 Windows 扩展.可以使你避免使用枯燥而且不方便的命令行.它完全嵌入 Windows Explorer,使用 ...
- [Python]python-jenkins获取正在构建中的job
需求: 我现在需要完成1个接口,这个接口会启动jenkins构建jobA, jobA构建结束, 返回job的构建结果 思路: 首先使用get_job_info获取最后1次构建的构建序号,然后再通过ge ...
- docker上传私有仓库报错
docker 1.17 版本搭建私有仓库,上传镜像报错:server gave HTTP response to HTTPS client” 系统环境:centos7docker版本:1.17(注意版 ...
- Sqlserver实现故障转移 — 加域(2)
目的:将计算机添加到域中, 域控的建立详见:https://www.cnblogs.com/xiaoerlang90/p/9224745.html 域控: 名称:dcTest.com IP: 192. ...
- Java并发编程之程序运行堆栈分析
Java程序运行的堆栈分析 1.JVM运行时数据区 JVM通过加载class文件的数据来执行程序.JVM在运行时会划分不同的区域以存放数据.如下图所示: 线程共享部分:所有线程都能访问这块内存的数据, ...