力扣题目
解题思路
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;
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项