240.搜索二维矩阵

·题目描述

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

示例 1:

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true

示例 2:

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
输出:false

·解题思路

想编写一个二维二分查找的算法,就是说将二维矩阵分为四个象限,根据中间值的大小判断要搜索的区域。但是每次对比完还需要查找余下三个象限的值,时间耗费比较多。

----如果想做该算法,需要搞清楚的事情是。当中间值   小于  target时候,需要查找的三个象限为左上、左下、右上;当中间值   大于   target  的时候,需要查找的三个象限为右上、左下、右下。

·Java代码


class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length, n = matrix[0].length;
        for(int i = 0; i < m ; i ++){
            int[] temp = matrix[i];
            if(find(temp, target, 0, n - 1)){
                return true;
            }
        }
        return false;
    }

    public static boolean find(int[] arr, int target, int lo, int hi ) {
      if(lo > hi ) return false;
      int mid = lo + (hi - lo ) / 2;
      if(arr[mid] == target){return true;}
      else if(arr[mid] > target){return find(arr, target, lo, mid - 1);}
      else{return find(arr, target, mid + 1, hi);}
    }
}

------耗时太长了,还不如每一行使用二分查找。但是做一点点小小的优化,只有当每一行的第一个元素   小于   target , 并且  最后一个元素   大于   target  的时候,才进行二分查找。

·Java 代码

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length, n = matrix[0].length;
        for(int i = 0; i < m ; i ++){
            int[] temp = matrix[i];
            if(temp[0] <= target && temp[n - 1] >= target){
                if(find(temp, target, 0, n - 1)){
                    return true;
                }
            }
        }
        return false;
    }

    public static boolean find(int[] arr, int target, int lo, int hi ) {
      if(lo > hi ) return false;
      int mid = lo + (hi - lo ) / 2;
      if(arr[mid] == target){return true;}
      else if(arr[mid] > target){return find(arr, target, lo, mid - 1);}
      else{return find(arr, target, mid + 1, hi);}
    }
}

当然还有一个暴力遍历求解就不说了。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值