题解 | #矩阵元素查找#

矩阵元素查找

http://www.nowcoder.com/practice/3afe6fabdb2c46ed98f06cfd9a20f2ce

描述

题目描述

给了我们一个二维数组, 和他的行和列, 给定我们一个值, 让我们在这个矩阵中找到等于这个值的横纵坐标, 并作为一个vectorvector返回

样例解释

样例输入

[[1,2,3],[4,5,6]],2,3,6

如图所示

20220207230626

所以我们的样例输出就是

[1,2]

题解

解法一:

实现思路

我们可以直接暴力遍历我们的这个矩阵, 然后我们直接找到位置的时候返回

代码实现

class Solution {
   public:
    vector<int> findElement(vector<vector<int> > mat, int n, int m, int x) {
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                if (mat[i][j] == x) return {i, j};
//         遍历我们的循环,如果找到直接返回
        return {};
//         没有找到的话,就返回空
    }
};

时空复杂度分析

时间复杂度: O(nm)O(n * m)

理由如下: 遍历了一个nmn * m的矩阵

空间复杂度: O(1)O(1)

理由如下: 未使用额外空间

解法二:

实现思路

我们根据题意可以得知, 我们的这个矩阵的行和列都可以保证是从大到小的, 那么我们也就是要寻找这样的一个满足条件的行, 行的第一个元素要比xx小, 然后我们的最后一个元素一定要比xx大, 然后我们直接在这个行中二分查找我们第一个大于等于xx的位置, 然后判断这个位置的值是不是等于xx, 如果等于我们直接返回我们的横纵坐标

代码实现

class Solution {
   public:
    vector<int> findElement(vector<vector<int>> mat, int n, int m, int x) {
        for (int i = 0; i < n; i++) {
            if (*mat[i].begin() > x or mat[i].back() < x) continue;
//             如果这列的第一个比x大,或者最后一个比x小那么我们一定是不可以的
            int pos = lower_bound(mat[i].begin(), mat[i].end(), x) - mat[i].begin();
//             二分找到满足答案的位置
            if (mat[i][pos] == x) return {i, pos};
//             如果这个位置正好就是等于x,那么我们可以把这个位置返回
        }
        return {};
    }
};

时空复杂度分析

时间复杂度: O(nlogm)O(nlogm)

理由如下: 我们遍历了所有的行, 然后我们对每一行二分查找

空间复杂度: O(1)O(1)

理由如下: 我们未使用额外的空间

机试题目题解 文章被收录于专栏

主要是机试题目的题目讲解和做法

全部评论

相关推荐

球球别再泡了:坏,我单9要了14
点赞 评论 收藏
分享
霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务