BM18. [二维数组中的查找]

alt

https://www.nowcoder.com/exam/oj?tab=%E7%AE%97%E6%B3%95%E7%AF%87&topicId=295

BM18. 二维数组中的查找

https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=295&sfm=github&channel=nowcoder

题目的主要信息:

  • 矩阵的行元素和列元素都是有序的,从左到右递增,从上到下递增,完全递增元素不会有重复
  • 找到矩阵中有没有给定元素即可

方法一:暴力法
具体做法:

从上到下每行,每行中从左至右遍历二维数组,依次查找。

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        if(array.size() == 0)  //优先判断特殊
            return false;
        int n = array.size();
        if(array[0].size() == 0)  
            return false;
        int m = array[0].size();
        for(int i = 0; i < n; i++)  //两层循环,遍历二维数组
            for(int j = 0; j < m; j++)
                if(array[i][j] == target)  //找到target
                    return true;
        return false;
    }
};

复杂度分析:

  • 时间复杂度:,二维数组的遍历
  • 空间复杂度:,没有使用额外空间

方法二:二分查找

具体做法:

既然矩阵里面的元素是有序且无重复的,我们可以好好利用一下。

首先看四个角,左上与右下必定为最小值与最大值,而左下与右上就有规律了:
左下元素大于它上方的元素,小于它右方的元素,右上元素与之相反
我们可以在查找时使用二分法
首先以左下角为起点,若是它小于目标元素,则往右移动去找大的,若是他大于目标元素,则往上移动去找小的。
图片说明

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        if(array.size() == 0)  //优先判断特殊
            return false;
        int n = array.size();
        if(array[0].size() == 0)  
            return false;
        int m = array[0].size();
        for(int i = n - 1, j = 0; i >= 0 && j < m; ){ //从最左下角的元素开始往左或往上
            if(array[i][j] > target)   //元素较大,往上走
                i--;
            else if(array[i][j] < target) //元素较小,往右走
                j++;
            else
                return true;
        }
        return false;
    }
};

复杂度分析:

  • 时间复杂度:,最多经过一行一列
  • 空间复杂度:,没有使用额外空间

alt

#面经##题解##面试题目#
全部评论

相关推荐

狸猫换offer:神通广大的互联网
点赞 评论 收藏
分享
昨天 11:18
门头沟学院 Java
作者先叠个甲:本人双非本,秋招拿到了多个大厂offer,这个过程也不容易,但是在看到很多秋招胜利之后说自己一路有多艰辛的文章,总感觉有一点不对劲,想了很久打算写一篇文章分析一下,本文仅代表作者观点,不认同的可以在评论区大家一起理性讨论。&nbsp;秋招已经结束,各类社交平台出现一大批“大厂上岸”胜利结算。文章的叙事逻辑高度相同,开篇就渲染焦虑和困惑,学习时的挑灯夜读、投递时的屡屡碰壁、面试时的如履薄冰,将过往经历包装成一步艰辛的“奋斗史”,然后最终以大厂offer的胜利结尾,字里行间全是苦尽甘来的优越感。但是在我看来,这类文章的本质是结果导向的、带有浮夸的叙事,因为其内核不是分享经验,而是借“苦难”之名...
创作小队长:你的批判视角非常犀利,尤其“结果决定叙事权”的洞察非常精准,哈哈想邀请你来成为我们的创作者🫰 但我想补充一个视角:许多分享者的初衷并非炫耀结果或者苦难,我更愿意相信他们在这个过程中付出了很多,在这场战役结束后,他们迫不及待地想被看到,记录和分享都是给自己的一个交代,而非真的教会别人什么,他们的初衷未必是想制造焦虑。求职市场的残酷、经济环境的下行、世俗价值观才是这种叙事流行的土壤,作为一个普通人无法抵抗洪流。 感谢你发起这场讨论。理想的社区,既需要这样锐利的批判来保持清醒,你的洞察非常犀利,也许会启发一些人,能逐渐改变这种叙事~
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务