m×n 矩陣,每行遞增,下一行首元素 > 上一行尾元素。判斷 target 是否存在。
索引映射:mid → matrix[mid/n][mid%n]。
int lo=0, hi=m*n-1;
while (lo<=hi) {
int mid = lo + (hi-lo)/2;
int val = matrix[mid/n][mid%n];
if (val==target) return true;
else if (val
起點 (0, n-1):若當前 > target 向左,< target 向下,相等返回 true。每步排除一行或一列。
int i=0, j=n-1;
while (i=0) {
if (matrix[i][j]==target) return true;
else if (matrix[i][j] > target) --j;
else ++i;
}
return false;
O(log mn),代碼簡潔,需矩陣完全有序(題目滿足)。O(m+n),但更通用(僅需行列各自有序,無需行首 > 前行尾)。
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix==null || matrix.length==0) return false;
int m=matrix.length, n=matrix[0].length;
int lo=0, hi=m*n-1;
while (lo<=hi) {
int mid = lo + (hi-lo)/2;
int val = matrix[mid/n][mid%n];
if (val==target) return true;
else if (val