Category | Difficulty | Likes | Dislikes |
---|---|---|---|
lcof | Medium (40.08%) | 706 | - |
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
现有矩阵 matrix 如下:
- [
- [1, 4, 7, 11, 15],
- [2, 5, 8, 12, 19],
- [3, 6, 9, 16, 22],
- [10, 13, 14, 17, 24],
- [18, 21, 23, 26, 30]
- ]
给定 target = 5
,返回 true
。
给定 target = 20
,返回 false
。
限制:
0 <= n <= 1000
0 <= m <= 1000
注意:本题与主站 240 题相同:力扣
方法一:深度搜索dfs进行递归
方法二:从左下角向上和向右搜索
向上:行首小于target,该行全部值小于target,往上走
向右:当前值小于target,该行往右搜索,若值大于target,继续往上走
- /*
- * @lc app=leetcode.cn id=100276 lang=cpp
- *
- * [剑指 Offer 04] 二维数组中的查找
- */
-
- // @lc code=start
- class Solution {
- public:
- //深度搜索dfs
- bool dfs(vector
int >>& visited, vectorint >> matrix, int i, int j, int target){ - if(i >= visited.size() || j >= visited[0].size() ) return false;
- if(matrix[i][j] == target) return true;
- if(matrix[i][j] > target) return false;
- if(visited[i][j]) return false;
-
- visited[i][j] = 1;
- return dfs(visited, matrix, i+1, j, target) || dfs(visited, matrix, i, j+1, target);
- }
-
-
-
- //搜索
- bool getAns(vector
int >>& matrix, int target){ - int i = matrix.size()-1, j = 0;
-
- while (i >= 0 && j <= matrix[0].size()-1)
- {
- if(matrix[i][j] == target)
- return true;
-
- //行扫描
- if(matrix[i][j] > target){
- i -= 1;
- }else {
- //列扫描
- j += 1;
- }
- }
- return false;
- }
-
- bool findNumberIn2DArray(vector
int >>& matrix, int target) { -
- if(matrix.size() == 0 || matrix[0].size() == 0)
- return false;
-
- if(matrix[0][0] > target)
- return false;
-
- return getAns(matrix, target);
-
- // //深度搜索dfs
- // vector
> visited(matrix.size(), vector(matrix[0].size(), 0)); - // return dfs(visited, matrix, 0, 0, target);
-
-
- }
- };
- // @lc code=end
-