持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
题目
编写一个高效的算法来判断m x n矩阵中,是否存在一个目标值。该矩阵具有如下特性:
- 每行中的整数从左到右按升序排列。
- 每行的第一个整数大于前一行的最后一个整数。
示例 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
提示:
m == matrix.lengthn == matrix[i].length1 <= m, n <= 100-104 <= matrix[i][j], target <= 104
解题
思路:二分查找
根据题目给的提示,我们可知:
- 每一列的每个数字,该数之上的数字,都比其小;
- 每一行的每个数字,该数右侧的数字,都比其大;
根据上面的提示,我们可以将这个二维数组看成是一个坐标轴
- 我们以坐标轴的左下角为起点
res,与目标值进行比较 - 如果目标值大于
res,说明res右边和下边的都不是我们要寻找的元素,res向上移动一位 - 如果目标值小于
res,说明目标值可能在res右边,也可能在res下边,res向右移动一位 - 重复上述过程,直到找到目标值,返回
true,否则返回false
- 时间复杂度:O(n)
- 空间复杂度:O(1)
代码:Java
public boolean searchMatrix(int[][] arr, int target) {
int left = arr.length - 1;
int right = 0;
while (left >= 0 && right <= arr[0].length) {
int mid = arr[left][right];
if (mid == target) {
return true;
}else if (mid > target) {
left--;
}else {
right++;
}
}
return false;
}