PROBLEM
剑指 Offer 04. 二维数组中的查找
难度 中等
MY ANSWER
相当于二叉搜索树。从右上角开始遍历,若值比target大则向左走,若小则向下走,无路可走时说明没有该整数,返回false。注意设置 j 初值时要考虑空矩阵的判断,否则过不了。时间复杂度O(n+m),空间复杂度O(1)。
class Solution { public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { int i = 0, j = matrix.size() ? matrix[0].size() - 1 : 0; while(i < matrix.size() && j >= 0) { if(matrix[i][j] == target) { return true; } if(matrix[i][j] > target) { j--; } else { i++; } } return false; } };
|
BETTER SOLUTION
思路相同,只不过从左下角开始遍历,好处是设置 i 初值时不需要判断空矩阵,耗时会少点。时间复杂度O(n+m),空间复杂度O(1)。
class Solution { public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { int i = matrix.size() - 1, j = 0; while(i >= 0 && j < matrix[0].size()) { if(matrix[i][j] > target) i--; else if(matrix[i][j] < target) j++; else return true; } return false; } };
|
SUMMARY
根据题目条件将矩阵抽象为二叉搜索树解决问题,解题时注意0值和边界判断。这题还尝试了用bfs解决,但时间过不了。