二维数组中的查找
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<vector<int>>& visited, vector<vector<int>> 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<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<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<vector<int>> visited(matrix.size(), vector<int>(matrix[0].size(), 0));
// return dfs(visited, matrix, 0, 0, target);
}
};
// @lc code=end
Accepted
- 129/129 cases passed (16 ms)
- Your runtime beats 97 % of cpp submissions
- Your memory usage beats 52.5 % of cpp submissions (12.7 MB)