思想:
从左边用二分查找,找到第一个大于目标的行。如果没有大于就返回最后一个小于或者等于的行。然后在行内再用二分查找看看有没有对应的数。
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int latRow=getRow(matrix, target, 0, matrix.length-1);
for(int i=0;i<=latRow;i++)
{
if(Arrays.binarySearch(matrix[i], target)>=0)
{
return true;
}
}
return false;
}
public int getRow(int [][] matrix,int target,int begin,int end)
{
if(begin==end)
{
return end;
}
if(begin>end)
{
return begin;
}
int middle=(begin+end)/2;
if(matrix[middle][0]<=target)
{
return getRow(matrix, target, middle+1, end);
}
else
{
return getRow(matrix, target, begin, middle-1);
}
}
}
还有一个别人的思路
just like searching a sorted an array; find the middle element and recursively search the rest 3/4 matrix; a decrease (devide) and conquer solution;
The time complexity is T(mn) = T(1/4 mn) + T(1/2 m*n) + 1
public boolean searchMatrix(int[][] matrix, int target) {
return(searchMatrixHelper(matrix, 0, 0, matrix.length-1, matrix[0].length-1, target));
}
private boolean searchMatrixHelper (int[][] matrix, int i, int j, int i_, int j_, int target){
if(i > i_ || j> j_){
return false;
}
int midRow= (i+i_)/2; int midCol=(j+j_)/2;
if(matrix[midRow][midCol] == target){
return true;
}else if(matrix[midRow][midCol] > target){
return (searchMatrixHelper(matrix, i ,j, i_, midCol-1, target) || searchMatrixHelper(matrix, i, midCol, midRow-1, j_, target));
}else{
return (searchMatrixHelper(matrix, midRow+1 ,j, i_, j_, target) || searchMatrixHelper(matrix, i, midCol+1, midRow, j_, target));
}
}
本文介绍了一种在二维有序矩阵中搜索特定元素的算法。通过两次使用二分查找技术,该算法能够在较短时间内定位到目标值。此外,还提供了一个递归解决方案,通过减少待搜索区域来提高效率。
664

被折叠的 条评论
为什么被折叠?



