文章目录
- 1. 题目链接
- 2. 题目大意
- 3. 示例
- 4. 解题思路
- 5. 参考代码
1. 题目链接
74. 搜索二维矩阵 - 力扣(LeetCode)
2. 题目大意
描述:给定一个 m×n 大小的有序二维矩阵 matrix。矩阵中每行元素从左到右升序排列,每列元素从上到下升序排列。再给定
一个目标值 target。
要求:判断矩阵中是否存在目标值 target。
说明:
- m==matrix.length。
- n==matrix[i].length。
- 1≤m,n≤100。
- −104≤matrix[i][j],target≤104。
3. 示例
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:True
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:False
4. 解题思路
二维矩阵是有序的,可以考虑使用二分搜索来进行查找。
- 首先二分查找遍历对角线元素,假设对角线元素的坐标为 (row,col)。把数组元素按对角线分为右上角部分和左下角部分。
- 然后对于当前对角线元素右侧第 row 行、对角线元素下侧第 col 列进行二分查找。
- 如果找到目标,直接返回
True
。 - 如果找不到目标,则缩小范围,继续查找。
- 直到所有对角线元素都遍历完,依旧没找到,则返回
False
。
- 如果找到目标,直接返回
5. 参考代码
class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m = matrix.length;int n = matrix[0].length;int left = 0;int right = m * n - 1;while (left <= right) {int mid = left + (right - left) / 2;int x = matrix[mid / n][mid % n];if (x == target) {return true;} else if (x < target) {left = mid + 1;} else {right = mid - 1;}}return false;}
}