二分查找

搜索二维矩阵

中等#74Java时间 O(log(m n))空间 O(1)

题目要做什么

矩阵每行非递减,后一行第一个数大于前一行最后一个数。判断目标值是否存在。

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

01 为什么这样做

按行展开后整个矩阵有序,可以直接做一维二分。下标 mid 对应行 mid/列数、列 mid%列数。

始终成立的条件

目标若存在,展开下标始终位于 [left, right] 中。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public boolean searchMatrix(int[][] matrix, int target) {3        int columns = matrix[0].length;4        int left = 0, right = matrix.length * columns - 1;5        while (left <= right) {6            int mid = left + (right - left) / 2;7            int value = matrix[mid / columns][mid % columns];8            if (value == target) return true;9            if (value < target) left = mid + 1;10            else right = mid - 1;11        }12        return false;13    }14}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索