Algorithms first
搜索二维矩阵 · 交互式算法学习
在每行升序且行间有序的矩阵中搜索目标。
#74 · 二分查找
搜索二维矩阵
Search a 2D Matrix
matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3矩阵3 个关键状态
步骤 1一维搜索区间是 [0,11]。
mid=5,value=1110,0
30,1
50,2
70,3
101,0
111,1
161,2
201,3
232,0
302,1
342,2
602,3
推荐
展平索引二分
时间
O(log(mn))空间 O(1)把矩阵视为一维升序数组,索引 i 对应 matrix[i/n][i%n]。
1function searchMatrix(a, t) {2 const m = a.length,3 n = a[0].length;4 let l = 0,5 r = m * n - 1;6 while (l <= r) {7 const x = (l + r) >> 1,8 v = a[Math.floor(x / n)][x % n];9 if (v === t) return true;10 v < t ? l = x + 1 : r = x - 111 }12 return false;13}多语言参考
来源 · CC BY-SA 4.0 ↗Java · C++ · Go
这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。
1class Solution {2 public boolean searchMatrix(int[][] matrix, int target) {3 int m = matrix.length, n = matrix[0].length;4 int left = 0, right = m * n - 1;5 while (left < right) {6 int mid = (left + right) >> 1;7 int x = mid / n, y = mid % n;8 if (matrix[x][y] >= target) {9 right = mid;10 } else {11 left = mid + 1;12 }13 }14 return matrix[left / n][left % n] == target;15 }16}交互式算法学习
从执行步骤真正理解 LeetCode 经典 150
本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。
AlgoViz Lab
搜索二维矩阵 · 解法对比
在每行升序且行间有序的矩阵中搜索目标。
- 测试用例
matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3- 题目分类
- 二分查找
- 解法对比
- 2
先找行再行内二分
线性找到可能行,再二分该行。
- 时间
O(m+log n)- 空间
O(1)
展平索引二分
把矩阵视为一维升序数组,索引 i 对应 matrix[i/n][i%n]。
- 时间
O(log(mn))- 空间
O(1)