Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >剑指offer第2题:二维数组查找

剑指offer第2题:二维数组查找

作者头像
鹏-程-万-里
发布于 2020-07-07 02:10:22
发布于 2020-07-07 02:10:22
34100
代码可运行
举报
运行总次数:0
代码可运行

二维数组的查找

剑指offer第2题:二维数组查找

题目描述

解法一:

当前数组从上到下是升序,从左到右也是升序,所以我们可以选择一个合适的入口点,通过判断当前的值与target的大小比较,然后选择我们将要遍历的方向。这是一个比较好的思路。

所以在选择遍历的入口时,我们可以选择左下角和右上角开始。从这两个入口处开始遍历时,我们的每一次的位置,都属于每一行和每一列的最值,比如一行的最大值,一列的最小值。当我们处于最值情况时,这个时候做出的每一次判断,会更加精确,能够做到不重不漏,结合之前写的一篇文章的过程图:

流程图

下面就是我们自己实现的代码,从左下角开始运动的哈~

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        if(matrix == null || matrix.length == 0) return false;
        int rows = matrix.length;
        int cols = matrix[0].length;
        int down = rows - 1;
        int left = 0;
        while(left < cols && down >=  0){//从左下角还是遍历
            if(matrix[down][left] > target){
                down--;
            }else if(matrix[down][left] < target){
                left++;
            }else{
                return true;
            }
        }
        return false;
    }
}
解法二:

由于每一行和每一列都具有升序的特征,我们也可以使用两次二分法来完成操作。

第一次二分法,我们选择锁定一行,然后就变成了一个一维数组查找target的情况了,这时,我们可以再次使用二分法,完成下一次的探索,如果没有找到则返回false

在进行二分法时需要注意一点:我们在进行第一个二分法时,如果nums[mid] > target,此时我们应该进行的操作时将left = mid而不是left = mid+1。为什么这样呢?因为在第一次的二分法时,我们只是确定target所在的行数,如果target就在mid行,那么此时的target也是大于nums[mid][0]的。如果直接left = mid+1,则有可能错过target所在行。

代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;
        int down = matrix.length - 1; //矩阵的行数
        int up = 0 ;
        int right = matrix[0].length - 1 ; //矩阵的列数
        int left = 0;

        while(up < down ){//首先对行数进行锁定
            int midRow = up + (down - up) / 2 + 1;//由于up无法+1,所以我们需要在midRow这里+1
            if(matrix[midRow][0] == target){
                return true;
            }else if(matrix[midRow][0] > target){
                down = midRow - 1;
            }else{
                up = midRow ;//此时不能对up+1,因为此时的target可能就在这一行
            }
        }
        while(left < right){//锁定列
            int midCol = left + (right - left) / 2 ;
            if(matrix[up][midCol] == target){
                return true;
            }else if(matrix[up][midCol] > target){
                right = midCol;
            }else{
                left = midCol + 1;
            }
        }
        return matrix[up][left] == target ;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java小白成长之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode题解——二维数组查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
码上积木
2021/01/25
1.6K0
力扣240——搜索二维矩阵
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
健程之道
2020/02/12
7300
力扣240——搜索二维矩阵
【剑指offer】二维数组查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
ConardLi
2019/09/08
3640
74. 搜索二维矩阵
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
张伦聪zhangluncong
2022/10/26
2170
数学题:查找,快速幂,二进制,剪绳子
各位小伙伴,又到周末啦~本周小白已经开始二刷《剑指offer》了,这次在LeetCode上面刷题,发现LeetCode上面的《剑指offer》和牛客上面的题目好像有一些差别。也提醒一下其他的小伙伴儿刷题的时候可以稍作留意啊!
鹏-程-万-里
2020/06/04
4940
剑指 offer 第一题: 二维数组中的查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
五分钟学算法
2019/03/14
9170
剑指 offer 第一题: 二维数组中的查找
剑指 offer 面试题精选图解 04 . 二维数组中的查找
今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 04 . 二维数组中的查找。
五分钟学算法
2020/05/29
3880
剑指 offer 面试题精选图解 04 . 二维数组中的查找
剑指offer | 04. 二维数组中的查找
针对一个二维数组,最简单的方式就是2层for循环逐一查找,这种方式时间复杂度O(M*N)。
孟君
2023/02/23
2830
剑指offer | 04. 二维数组中的查找
剑指offer | 面试题3:二维数组的查找
往期推荐 干货 | 手撕十大经典排序算法 剑指offer | 认识面试 剑指offer | 面试题2:实现Singleton模式 面试题3: 二维数组中的查找 “题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的个二维数组和一个整数,判断数组中是否含有该整数。 “leetcode:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/submissio
千羽
2021/12/29
2130
剑指offer | 面试题3:二维数组的查找
每天一道leetcode378-有序矩阵中第K小的元素
https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/
乔戈里
2019/09/17
1.1K0
二维数组中的查找
给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。
崩天的勾玉
2021/12/20
2.1K0
每日一题《剑指offer》数组篇之二维数组中的查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
终有救赎
2023/10/16
2160
每日一题《剑指offer》数组篇之二维数组中的查找
java二维数组查找
问题:在一个二维数组中,每行每列都递增排序,在这个数组中查找一个数字,如果存在返回true,否则返回flase。
全栈程序员站长
2022/09/02
6550
java二维数组查找
二维数组中的查找
给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。
MickyInvQ
2021/10/26
2.3K0
面试手撕算法系列:二分法
这些都是LeetCode上有的题目 手撕无非就是 树、链表、二分、字符串这些常用的数据结构
程序员小猿
2021/01/19
5920
面试手撕算法系列:二分法
二分查找总结
二分查找是在每次匹配后,将查找的空间一分为二的算法,二分查找应该是有序的数组进行查找.
Tim在路上
2020/08/04
4940
力扣 - 剑指 Offer 04. 二维数组中的查找
题目# 剑指 Offer 04. 二维数组中的查找 思路1# 暴力遍历寻找 代码# class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return false; } int ro
冬夜先生
2021/10/20
2010
剑指Offer-二维数组中的查找
package Array; /** * 二维数组中的查找 * 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 * 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 */ public class Solution11 { public static void main(String[] args) { Solution11 solution11 = new Solution11();
武培轩
2018/04/18
6430
LeetCode-算法-二分查找-第15天
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。
布衣者
2021/09/07
2690
剑指Offer:面试题04. 二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
Yuyy
2022/06/28
2060
剑指Offer:面试题04. 二维数组中的查找
相关推荐
LeetCode题解——二维数组查找
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验