• 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)
  • 相关阅读:
    2022年学Java开发的10个理由
    自定义iOS注解
    SecureCRT 9.4.2最新终端SSH工具
    JVM原理和优化
    职场小白必学技巧之:手把手教你分割PDF怎么操作
    如何克服发票自动化的 4 个最常见障碍
    《最新出炉》系列初窥篇-Python+Playwright自动化测试-17-处理鼠标悬停
    Java线程中的状态
    Java实用类(五) -Math类和指定范围的随机数
    Linux系统编程_进程间通信第1天:IPC、无名管道pipe和命名管道mkfifo(半双工)、消息队列msgget(全双工)
  • 原文地址:https://blog.csdn.net/qq_32116001/article/details/126616956