每天学习一点算法 2026/03/29
题目:搜索二维矩阵 II
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
-
最容易想到办法就是遍历矩阵,我们可以调整一下遍历条件,但是极端情况还是
O(mn)时间复杂度typescriptfunction searchMatrix(matrix: number[][], target: number): boolean { let maxRow = matrix.length let maxCol = matrix[0].length for (let i = 0; i < maxRow; i++) { for (let j = 0; j < maxCol; j++) { if (matrix[i][j] === target) { return true } if (matrix[i][j] > target) { // 根据遍历结果不断缩小行的边界 if (j === 0) return false maxCol = j } } } return false }; -
每一行否是递增的数组,我们可以用二分法去在每行查找目标。
typescriptfunction searchMatrix(matrix: number[][], target: number): boolean { let maxRow = matrix.length function helper (nums: number[]) { let left = 0, right = nums.length while (left <= right) { const mid = Math.floor((left + right) / 2) if (nums[mid] == target) return true if (nums[mid] > target) right = mid - 1 else left = mid + 1 } return false } for (let i = 0; i < maxRow; i++) { const isFind = helper(matrix[i]) if (isFind) return true } return false }; -
我们其实可以发现每次遍历我们都可以缩小行的边界,那么我们可以从
[0, n - 1]处开始遍历,如果matrix[i][j]大于 目标值,那么就j--,否则i++,直到碰到边界还没找到,就是没有目标值typescriptfunction searchMatrix(matrix: number[][], target: number): boolean { let i = 0 let j = matrix[0].length - 1 while (i < matrix.length && j >= 0) { if (matrix[i][j] === target) return true if (matrix[i][j] > target) { j-- } else { i++ } } return false };
题目来源:力扣(LeetCode)