LeetCode/二维矩阵搜索


编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

每行的元素从左到右升序排列。
每列的元素从上到下升序排列。

1. 暴力求解

两重循环,时间复杂度O(m*n)

两重循环
class Solution {
public:
    bool searchMatrix(vector>& matrix, int target) {
        for (const auto& row: matrix) {
            for (int element: row) {
                if (element == target) {
                    return true;
                }
            }
        }
        return false;
    }
};

2. Z字形双指针

由于二维数组在行列上分别满足升序,可以用两个指针分别找出其在行与列上的位置
行从前往后遍历,列从后往前遍历,之所以不能同时一个方向,是与target比较时,无法决定先移动哪个指针
时间复杂度为O(m+n)

Z字形双指针
class Solution {
public:
    bool searchMatrix(vector>& matrix, int target) {
        int m = matrix.size(), n = matrix[0].size();
        int x = 0, y = n - 1;
        while (x < m && y >= 0) {
            if (matrix[x][y] == target) {
                return true;
            }
            if (matrix[x][y] > target) {
                --y;
            }
            else {
                ++x;
            }
        }
        return false;
    }
};

3. 回溯法(深度优先)

递归向右和向下,对于遍历过的路径做标记防止重复
时间复杂度应该为O(m*n),但不知道为什么实际执行时性能比方法二还好

回溯法
class Solution {
public:
    bool flag=false;
    bool searchMatrix(vector>& matrix, int target) {
        search(matrix,target,0,0);
        return flag;
    }

    void search(vector>& matrix,int target,int i,int j){
        if(flag==true||matrix[i][j]==-2) return; //剪去其他遍历分支

        if(matrix[i][j]==target){ flag=true; return;}//满足条件跳出遍历
        if(matrix[i][j]