每日一题:Leetcode-74 探索二维矩阵

力扣题目

解题思路

java代码

力扣题目:

给你一个满足下述两条属性的 m x n 整数矩阵:

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

示例 1:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例 2:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

解题思路:

算法原理
通过两次二分查找来解决在二维矩阵中查找目标值的问题。第一次二分查找确定目标值可能所在的行,第二次二分查找在确定的行中查找目标值。

思路

  • 首先对矩阵的行进行二分查找。比较中间行的首元素与目标值的大小,缩小行的范围,直到确定目标值可能所在的行。
  • 然后对确定的行进行二分查找,比较中间元素与目标值的大小,更新左右指针,直到找到目标值或者确定目标值不存在。

代码分析

  • 在 searchMatrix 方法中,首先通过一个循环进行第一次二分查找确定行。
    • 计算中间行的索引 mid 。
    • 根据中间行首元素与目标值的大小关系更新左右指针。
  • 确定行 row 后,再次初始化左右指针,进行第二次二分查找。
    • 计算中间元素的索引 mid 。
    • 根据中间元素与目标值的比较结果更新左右指针,直到找到目标值或者确定不存在。

时间复杂度:O(log(m) + log(n)),其中 m 是矩阵的行数,n 是矩阵每行的列数。第一次二分查找行的时间复杂度为 log(m),第二次二分查找列的时间复杂度为  log(n)。

空间复杂度:log(1),只使用了固定的几个变量,空间开销恒定。

java代码:

package mouth8;

public class Leetcode74 {
    public static void main(String[] args) {
        System.out.println(new Leetcode74().searchMatrix(new int[][]{{1, 3, 5, 7}, {10, 11, 16, 20}, {23, 30, 34, 60}}, 3));
        System.out.println(new Leetcode74().searchMatrix(new int[][]{{1, 3, 5, 7}, {10, 11, 16, 20}, {23, 30, 34, 60}}, 13));
    }
    public boolean searchMatrix(int[][] matrix, int target) {
        int left = 0;
        int right = matrix.length - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (matrix[mid][0] > target) {
                right = mid - 1;
            } else {
                left = mid;
            }
        }
        int row = left;
        left = 0;
        right = matrix[row].length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (matrix[row][mid] == target) {
                return true;
            } else if (matrix[row][mid] > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return false;
    }
}

更多详细内容同步到公众号,感谢大家的支持!

每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L.2626

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值