• 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)
  • 相关阅读:
    【0基础学Java第二课】数据类型与变量
    杂记,主要包含各种锁
    SystemUI控制状态栏通知面板自动展开和收起
    环氧聚醚接枝胺化聚苯乙烯微球/AM型聚苯乙烯微球氧氟沙星聚合物的制备
    Yew应用中如何获取<textarea/>的值?
    EDA实验-----4*4矩阵键盘与数码管显示测试(Quartus ‖)
    [附源码]计算机毕业设计游戏论坛网站Springboot程序
    WPF ContentControl 和 ContentPresenter 之间有什么区别
    Leetcode -2
    软考高项-计算题(2)
  • 原文地址:https://blog.csdn.net/qq_32116001/article/details/126616956