240搜索二维矩阵2

1、二分查找,每行二分

//    public boolean searchMatrix(int[][] matrix, int target) {
    //     //每层二分
    //     if (matrix == null || matrix.length == 0) return false;
    //     for (int i = 0; i < matrix.length; i++) {
    //         //每层二分
    //         int left = 0;
    //         int right = matrix[0].length - 1;
    //         while (left <= right){
    //             int mid = left + (right - left) / 2;
    //             if (matrix[i][mid] == target){
    //                 return true;
    //             }else if (matrix[i][mid] > target){
    //                 right = mid - 1;
    //             }else {
    //                 left = mid + 1;
    //             }
    //         }
    //     }
    //     return false;
    // }

2、先二分找到行,然后作为左下角,一直去缩小

    //    public boolean searchMatrix(int[][] matrix, int target) {
    //     if (matrix.length == 0 || matrix[0].length == 0) return false;
    //     return searchMatrix(matrix,target,0,matrix[0].length - 1,0,matrix.length - 1);
    // }
    // public boolean searchMatrix(int[][] matrix, int target,int left,int right,int up,int down) {
    //     //双层二分:找右上
    //         if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;
    //         if (left > right || up > down) return false;
    //         if (left < 0) return false;
    //         //先找中间第一个大于target的
    //     //int left = 0;
    //     //int right = matrix.length;
    //     while (up <= down){
    //         int mid = up + (down - up) / 2;
    //         if (matrix[mid][left] == target) return true;
    //         if (matrix[mid][left] < target){
    //             up = mid + 1;//最后一个小于他的
    //         }else {
    //             down = mid - 1;
    //         }
    //     }
    //     return searchMatrix(matrix,target,left + 1,right,0,up - 1);
    // }

3、找中间行,然后对中间行进行划分,找左下和右上

 //  public boolean searchMatrix(int[][] matrix, int target) {
    //    if (matrix.length == 0 || matrix[0].length == 0) return false;
    //    return search(matrix,target,0,matrix[0].length - 1,0,matrix.length - 1);
    // }
    // public boolean search(int[][] matrix,int target,int left,int right,int up,int down){
    //     if (left > right || up > down) return false;
    //     if (target < matrix[up][left] || target > matrix[down][right]) return false;
    //     
    //     int mid = (up + down) / 2;
    //     int midY = left;
    //     while (midY <= right && matrix[mid][midY] <= target){
    //         if (matrix[mid][midY] == target){
    //             return true;
    //         }
    //         midY++;
    //     }
    //     //再去左下和右上去找
    //     return search(matrix,target,left,midY - 1,mid + 1,down) || 
    //             search(matrix,target,midY,right,up,mid - 1);
    // }

4、最好:从左下角开始,比他大向上,比他小向右

        public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix.length == 0 || matrix[0].length == 0) return false;
       //从左下角开始走
        int row = matrix.length - 1;
        int col = 0;
        while (row >= 0 && col < matrix[0].length) {
            if (target == matrix[row][col]) {
                return true;
            }else if (target < matrix[row][col]){
                row--;
            }else {
                col++;
            }
        }
        return false;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值