写出一个高效的算法来搜索 m × n矩阵中的值。
这个矩阵具有以下特性:
每行中的整数从左到右是排序的。
每行的第一个数大于上一行的最后一个整数。
样例
考虑下列矩阵:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
给出 target = 3,返回 true
挑战
O(log(n) + log(m)) 时间复杂度
解题思路:根据题意O(m+n)可行的,从右上角开始搜索,但是根据题意可以用二分的思路实现O(log(m)+log(n))。实际上Ologmn是不可行的,详见leetcode。
O(m+n)
public class Solution {
/**
* @param matrix, a list of lists of integers
* @param target, an integer
* @return a boolean, indicate whether matrix contains target
*/
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;
int row = matrix.length-1;
int col = matrix[0].length-1;
int i = 0;
int j = col;
return search(matrix, target, i, j);
}
public boolean search(int[][] matrix, int target, int i, int j){
if(i < 0 || i >= matrix.length || j < 0 || j >= matrix[0].length) return false;
if(target == matrix[i][j]) return true;
if(target < matrix[i][j]) return search(matrix, target, i, j-1);
return search(matrix, target, i+1, j);
}
}
public class Solution {
/**
* @param matrix, a list of lists of integers
* @param target, an integer
* @return a boolean, indicate whether matrix contains target
*/
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;
int row = matrix.length-1;
int col = matrix[0].length-1;
int i = 0;
int j = col;
while(i <= row && j >= 0){
if(matrix[i][j] == target) return true;
else if(matrix[i][j] > target) j--;
else i++;
}
return false;
}
}
O(log(m)+log(n)),这个做法是错误的。
public class Solution {
/**
* @param matrix, a list of lists of integers
* @param target, an integer
* @return a boolean, indicate whether matrix contains target
*/
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;
int row = matrix.length-1;
int col = matrix[0].length-1;
if(matrix[0][0] > target || matrix[row][col] < target) return false;
int i = 0;
int j = row;
while(i < j){
int mid = (i+j+1)/2;
if(matrix[mid][0] == target) return true;
else if(matrix[mid][0] > target) j = mid-1;
else i = mid;
}
int start = i;
i = 0;
j = col;
while(i <= j){
int mid = (i+j)/2;
if(matrix[start][mid] == target) return true;
else if(matrix[start][mid] > target) j = mid-1;
else i = mid+1;
}
return false;
}
}