给你一个满足下述两条属性的 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
解法一 二分法
看到了有序序列,啥都不用想直接二分,只需要考虑到怎么把二分时候的下标转换为矩阵的行、列下标就可以了,很简单,用除法和求余就够了。
public boolean searchMatrix(int[][] matrix, int target) {int rows = matrix.length;if (rows == 0) {return false;}int cols = matrix[0].length;int left = 0;int right = rows * cols - 1;while (left <= right) {int mid = (left + right) / 2;int temp = matrix[mid / cols][mid % cols];if (temp == target) {return true;} else if (temp < target) {left = mid + 1;} else {right = mid - 1;}}return false;
}
时间复杂度:O ( log ( n ) )。
空间复杂度:O ( 1 )。