LeetCode 74 Search a 2D Matrix

147 阅读1分钟

LeetCode 74 Search a 2D Matrix

思路

  1. 通过每一行的头和尾来确定搜索范围(低效)

  2. 整个二维数组转为一维数组后,是递增的,因此,使用带索引转换的二分查找即可。对于一个 m * n的二维数组,第i行第j列对应一维数组的 i * m + j。因此,若已知一维数组的索引是x,那么对应的二维数组位置是 x / m 行 x % m 列。

代码

低效方法

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if (matrix.empty() || matrix[0].empty()) return false;
        int m = matrix.size(), n = matrix[0].size();
        
        for (int i = 0; i < m; ++i) {
            if (target < matrix[i].front()) break;
            if (target <= matrix[i].back())
                for (int j = 0; j < n; ++j) {
                    if (matrix[i][j] == target)
                        return true;
                    else if (matrix[i][j] > target) break;
                }
        }
        
        return false;
    }
};

索引转换

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if (matrix.empty() || matrix[0].empty()) return false;
        int m = matrix.size(), n = matrix[0].size();
        int left = 0, right = m * n;
        
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (matrix[mid / n][mid % n] < target) left = mid + 1;
            else right = mid;
        }
        
        if (left == m*n) return false;
        return matrix[left/n][left%n] == target;
    }
};