【LeetCode】240.搜索二维矩阵Ⅱ

题目

编写一个高效的算法来搜索 m xn 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

示例 1:

复制代码
输入: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

示例 2:

复制代码
输入: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 = 20
输出:false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= n, m <= 300
  • -10^9 <= matrix[i][j] <= 10^9
  • 每行的所有元素从左到右升序排列
  • 每列的所有元素从上到下升序排列
  • -10^9 <= target <= 10^9

解答

源代码

java 复制代码
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        return dfs(matrix, 0, matrix[0].length - 1, target);
    }

    public boolean dfs(int[][] matrix, int i, int j, int target) {
        if (i >= matrix.length || j < 0) {
            return false;
        }

        if (matrix[i][j] == target) {
            return true;
        } else if (matrix[i][j] > target) {
            return dfs(matrix, i, j - 1, target);
        } else {
            return dfs(matrix, i + 1, j, target);
        }
    }
}

总结

想用递归,但重点在于递归的起点在哪里。一开始我把递归的起点定在了左上角,这样做出来的算法其实比暴力破解还糟糕;把起点定在右上角才是正确的选择,此时当前元素的左边都比它小,下边都比它大。

相关推荐
Olrookie19 分钟前
若依前后端分离版学习笔记(二十)——实现滑块验证码(vue3)
java·前端·笔记·后端·学习·vue·ruoyi
茉莉玫瑰花茶29 分钟前
floodfill 算法(dfs)
算法·深度优先
CoderCodingNo1 小时前
【GESP】C++五级考试大纲知识点梳理, (5) 算法复杂度估算(多项式、对数)
开发语言·c++·算法
倚栏听风雨1 小时前
java.lang.SecurityException异常
java
星河队长1 小时前
VS创建C++动态库和C#访问过程
java·c++·c#
MYX_3092 小时前
第三章 线型神经网络
深度学习·神经网络·学习·算法
鼠鼠我捏,要死了捏2 小时前
Java虚拟线程原理与性能优化实战
java·performance-optimization·virtual-thread
艾菜籽2 小时前
Spring MVC练习:留言板
java·spring·mvc
左灯右行的爱情2 小时前
4-Spring SPI机制解读
java·后端·spring
Code小翊2 小时前
C语言bsearch的使用
java·c语言·前端