搜索二维矩阵---2023/02/09

文章介绍了两种方法解决搜索二维矩阵问题。思路一是利用二分法先确定目标值所在行,然后在该行内继续二分查找,但这种方法可能超时且搜索不全面。思路二是将矩阵视为二叉搜索树,从右上角开始,根据目标值大小决定向下或向左移动,提供了一种更高效的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

搜索二维矩阵

解题思路

思路一:先取第一行,使用二分法确定target所在行数,其次再对确定的行使用二分法寻找target值,如果找到则返回true,否则false。
不足:超出时间限制。
未考虑完全的点:首行中,比target小的值所在的列都有可能存在target,不应该只有固定行对应的列,而是一个范围进行搜索。从而确定固定行对应的列以及固定列对应的行,这样搜索才是全面的。

思路二:参考其他的方法,从右上角看,实际上是一棵二叉搜索树,目标值小的话往左走,目标值更大的话往下走。

代码实现

思路一代码:

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int row=matrix.length;
        int col=matrix[0].length;

        // // 提取第一行的数据,来判断target在第几行
        // int[] col_num=new int[col];
        // for(int i=0;i<col;i++){
        //     col_num[i]=matrix[0][i];
        // }

        int left=0;
        int right=col-1;
        while(left<right){
            if(matrix[0][(left+right)/2]>target){
                right=(left+right)/2;
            }
            else {
                left=(left+right)/2;
            }
        }
        // 此时left是我们需要的定位行
        if(matrix[0][left]==target||matrix[0][right]==target) return true;

        int tag=left;
        left=0;
        right=row-1;
        while(left<right){
            if(matrix[(left+right)/2][tag]>target){
                right=(left+right)/2;
            }
            else {
                left=(left+right)/2;
            }
        }
        // 此时left是我们需要的定位行
        if(matrix[left][tag]==target||matrix[right][tag]==target) return true;
        return false;
    }
}

思路二代码:

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int rowl=matrix.length;
        int coll=matrix[0].length;

        int row=0,col=matrix[0].length-1;
        while(col>=0 && row< rowl){
            if(matrix[row][col]>target)
            {
                col--;
            }
            else{
                if(matrix[row][col]==target)
                {
                    return true;
                }

                row++;

            }
        }
         return false;

    }
}

心得:永远不要放弃,永远会有更奇妙的方法在等着你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值