思路

  • 暴力搜索,双重循环遍历
  • 依据有序性按照一定顺序来查找

方法一:暴力搜索

双重循环直接遍历所有元素找到指定元素

class Solution {
public:
    vector<int> findElement(vector<vector<int> > mat, int n, int m, int x) {
        // write code here
        for(int i = 0; i < n; i++) {                // 遍历行
            for(int j = 0; j < m; j++) {            // 遍历列
                if(mat[i][j] == x) return {i,j};    // 如果找到相等的元素则返回坐标
            }
        }
        return {};
    }
};

复杂度分析

  • 时间复杂度:O(n^2),双重循环的时间
  • 空间复杂度:O(1),未引入任何其他空间消耗

方法二:按序搜索(二分的思路)

由于二维数组是有序的,我们只需要选择起点为左下角处,从这里出发,向右的数字都比当前大,向上的数字都比当前小,因此实现了一个单右方向和单上方向的寻找路线,大大节省了时间代价
图片说明

class Solution {
public:
    vector<int> findElement(vector<vector<int> > mat, int n, int m, int x) {
        // write code here
        for(int i = n-1, j = 0; i>=0 && j < m;) {        // 构造起点
            if(mat[i][j] == x) return {i,j};             // 如果找到目标值则返回坐标
            if(mat[i][j] > x) i--;                       // 如果当前值大于目标值则向上单向寻找
            if(mat[i][j] < x) j++;                       // 如果当前值小于目标值则向右单向寻找
        }
        return {};
    }
};

复杂度分析

  • 时间复杂度:O(M+N),最长的查找时间也是扫过一长一宽的时间
  • 空间复杂度:O(1),不需要无额外空间申请