Search a 2D Matrix II

本文介绍了一种在二维有序矩阵中搜索特定元素的算法。通过两次使用二分查找技术,该算法能够在较短时间内定位到目标值。此外,还提供了一个递归解决方案,通过减少待搜索区域来提高效率。

题目地址

思想:
从左边用二分查找,找到第一个大于目标的行。如果没有大于就返回最后一个小于或者等于的行。然后在行内再用二分查找看看有没有对应的数。

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));
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值