搜索二维矩阵

这篇博客探讨了如何在一个特殊排序的矩阵中高效地查找目标值。矩阵的每一行按升序排列,且每行的第一个整数大于前一行的最后一个整数。通过二分查找的思想,可以将问题转化为在行展开的排序数组中查找目标值。同时,提供了两种不同的搜索策略,一种基于二分查找,另一种从矩阵的右上角开始逐行或列排除。这两种方法都大大提高了查找效率。
摘要由CSDN通过智能技术生成

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

每行中的整数从左到右按升序排列。列从上到下升序排序
每行的第一个整数大于前一行的最后一个整数。
在这里插入图片描述
可以看出,按行展开就是一个排序的数组, 矩阵的横坐标=中间坐标(mid)/ 列数(n)
纵坐标=中间坐标(mid)% 列数(n),这样就成了一个二分查找

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        
         //可以看出,该矩阵按行展开是一个升序的数组,可以根据二分查找
        //求得行数m与列数n
        int m = matrix.length, n = matrix[0].length;
        //二分查找,确定左右边界
        int low = 0, high = m * n - 1;

        while (low <= high) {
            int mid = (high - low) / 2 + low;//中间坐标

            //矩阵的横坐标=中间坐标(mid)/列数(n)
            //纵坐标=中间坐标(mid)%列数(n)
            int x = matrix[mid / n][mid % n];
            if (x < target) {
                low = mid + 1;
            } else if (x > target) {
                high = mid - 1;
            } else {
                return true;
            }
        }
        return false;
    }
}

若将上面的条件中的每行的第一个整数大于前一行的最后一个整数这个调节应该如何查询
[1 ,2,8 ,9 ],
[2,4,9,12 ],
[4,7,10,13],
[6,8,11,15]

在这里插入图片描述

class Solution {
    public boolean searchArray(int[][] array, int target) {
        //我们可以每次从矩阵的右上角开始查,因为要炸找的值如果比这个数大,则这一行就不用再看了,
        //因为他们比该值还小,反之之一列就不用看了
        //i表示行,j表示列
        if(array.length<=0 || array[0].length<=0)
        return false;
        int i=0,j=array[0].length-1;
        //如果i超过了最大行数或者j小于了最小列数,则表示矩阵已经空了
        while(i<array.length&&j>=0){
            int x=array[i][j];
            if(x==target){
                return true ;//找到了返回true
            }
            if(target<x)j--;//要查找的值比右上角的值小,则去掉这一列
            else i++;//要查找的值比右上角的值大,则去掉这一行
        }
        return false;
        
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值