28 - 搜索二维矩阵

5.2

可能是刚开始想复杂了吧。

大致思路就是先确定某一行,再确定这一行中是不是含有就可以了。

确定列的时候采用二分查找是没有问题的。

在查找行的时候也想用二分查找,但是出现了一些问题,查找不准确。

后来想,就是找到首元素小于target的最大值那一行就可以了。

然后后来在判断一下。如果 nums【行】【尾元素】的值 < target,行 ++; 如果【行】【首元素】的值 > targer,行- -。

这样对于行的查找就更准确了。

可能比较笨吧。

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){
            return false;
        }
        int m = matrix.length;
        if(m == 0){
            return false;
        }
        int n = matrix[0].length;
        if(n == 0){
            return false;
        }
        //System.out.print("m" + m);
        if(target < matrix[0][0] || target >matrix[m-1][n-1]){
            return false;
        }
        int low = 0;
        int height = m-1;
        int mid1 = 0;
        //这里先找到某一行,这一行的头元素是最大的小于target的值
        /*就是先要把行确定了
             如果查找 行 也采用二分查找的话
             二分查找的原则是什么呢?
             如果 行的尾元素是小于 mid 的值
             那就 ++;{
                 此时如果行的首元素变得大于 mid了,
                 就可以直接返回false了。
             }
        
        或者说,其实也没有那么复杂
            就是找到 小于 target 的最大值,返回那一行就可以了。    
             */
        
        while(low < height){
            if(matrix[low][0] == target || matrix[height][0] == target){
                return true;
            }
           
            mid1 = (low + height)/2;
            if(matrix[mid1][0] == target){
                return true;
            }
            if(matrix[mid1][0] > target){
                height = mid1 -1;
                continue;
            }
            if(matrix[mid1][0] < target){
                low = mid1 + 1;
                continue;
            }
        }
       
        if(matrix[mid1][0] > target){
            mid1 --;
        }
        if(matrix[mid1][n-1] < target){
            mid1 ++;
        }
        //System.out.print("mid1 = " + mid1);
        if(matrix[mid1][n-1]==target){
            return true;
        }
        int left = 0;
        int right = n-1;
        int mid = 0;
        while(left <= right){
            if(matrix[mid1][low] == target || matrix[mid1][right] == target){
                return true;
            }
           
            mid = (left + right)/2;
             if(matrix[mid1][left] == target || matrix[mid1][right] == target){
                return true;
            }
            if(matrix[mid1][mid] == target){
                return true;
            }
            if(matrix[mid1][mid] < target){
                left = mid + 1;
            }
            if(matrix[mid1][mid] > target){
                right = mid - 1;
            }
        }
        return false;
        // write your code here
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值