• JZ04 [剑指 Offer 04] 二维数组中的查找


    二维数组中的查找

    CategoryDifficultyLikesDislikes
    lcofMedium (40.08%)706-

    在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    示例:

    现有矩阵 matrix 如下:

    1. [
    2. [1, 4, 7, 11, 15],
    3. [2, 5, 8, 12, 19],
    4. [3, 6, 9, 16, 22],
    5. [10, 13, 14, 17, 24],
    6. [18, 21, 23, 26, 30]
    7. ]

    给定 target = 5,返回 true

    给定 target = 20,返回 false

    限制:

    0 <= n <= 1000

    0 <= m <= 1000

    注意:本题与主站 240 题相同:力扣


    Discussion | Solution

    分析:

    方法一:深度搜索dfs进行递归

    方法二:从左下角向上和向右搜索

            向上:行首小于target,该行全部值小于target,往上走

            向右:当前值小于target,该行往右搜索,若值大于target,继续往上走

            

    代码:

    1. /*
    2. * @lc app=leetcode.cn id=100276 lang=cpp
    3. *
    4. * [剑指 Offer 04] 二维数组中的查找
    5. */
    6. // @lc code=start
    7. class Solution {
    8. public:
    9. //深度搜索dfs
    10. bool dfs(vectorint>>& visited, vectorint>> matrix, int i, int j, int target){
    11. if(i >= visited.size() || j >= visited[0].size() ) return false;
    12. if(matrix[i][j] == target) return true;
    13. if(matrix[i][j] > target) return false;
    14. if(visited[i][j]) return false;
    15. visited[i][j] = 1;
    16. return dfs(visited, matrix, i+1, j, target) || dfs(visited, matrix, i, j+1, target);
    17. }
    18. //搜索
    19. bool getAns(vectorint>>& matrix, int target){
    20. int i = matrix.size()-1, j = 0;
    21. while (i >= 0 && j <= matrix[0].size()-1)
    22. {
    23. if(matrix[i][j] == target)
    24. return true;
    25. //行扫描
    26. if(matrix[i][j] > target){
    27. i -= 1;
    28. }else {
    29. //列扫描
    30. j += 1;
    31. }
    32. }
    33. return false;
    34. }
    35. bool findNumberIn2DArray(vectorint>>& matrix, int target) {
    36. if(matrix.size() == 0 || matrix[0].size() == 0)
    37. return false;
    38. if(matrix[0][0] > target)
    39. return false;
    40. return getAns(matrix, target);
    41. // //深度搜索dfs
    42. // vector> visited(matrix.size(), vector(matrix[0].size(), 0));
    43. // return dfs(visited, matrix, 0, 0, target);
    44. }
    45. };
    46. // @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)
  • 相关阅读:
    2-5 mysql常用查询
    FIORI:创建项目与部署
    聊聊基于Alink库的主成分分析(PCA)
    如何在洛谷里面新建自己的题目、配置数据点
    直线导轨滑块的固定方式
    MeterSphere 至学篇
    【C++】模板初阶 【 深入浅出理解 模板 】
    跨平台客户端Blazor方案尝试
    Delphi编程中的按键模拟及应用——使用SendInput函数实现按键模拟
    【Promise12数据集】Promise12数据集介绍和预处理
  • 原文地址:https://blog.csdn.net/qq_32116001/article/details/126616956