240搜索二维矩阵_剑指Offer_4 二维数组中的查找

本文介绍了如何在一个按特定规则排序的二维数组中查找指定整数,提供了暴力求解和二分查找两种方法,强调了二分查找在效率上的优势,并给出具体的代码实现。通过实例和技巧分析,帮助理解算法思路。

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

** 问题 **

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。判断数组中是否含有某整数。
在这里插入图片描述
** 例子 **
在这里插入图片描述
** 思路 **

  1. 暴力 O(n^2)

把二维数组中所有的元素取出来,放到set中,看set中是否有该数

  1. 也很暴力

从左上角开始[0][0],取出元素和该数比较,如果大于,让i+1或j+1,接着比,如果小于,让i-1或j-1接着比
在这里插入图片描述

  1. 二分查找 O(nlogn)

每一行都是从左到右递增的,对每一行进行二分查找

  1. O(m+n)

由于行只能减少 m 次,而列只能增加 nn次,因此在导致 while 循环终止之前,循环不能运行超过 n+m 次。

  • 从左下角来看,向上数字递减,向右数字递增,因此从左下角开始查找,当要查找数字比左下角数字大时。右移要查找数字比左下角数字小时,上移。
  • 跟方法2相比,每次都比较后都少一列或一行,将比较区域极大的缩小
    在这里插入图片描述
    在这里插入图片描述
    ** 代码 **
//方法3
public class Solution {
    //二分查找,递归
   public boolean binarySearch(int[] array, int low, int high,int target) {
        //low>high要放在最前面,因为后面的[low],[high]可能会有越界
        if (low>high || target<array[low] || target>array[high] ) return false;
        int mid = (low+high)/2;
        if (array[mid]>target) return binarySearch(array,low,mid-1,target);
        if (array[mid]<target) return binarySearch(array,mid+1,high,target);
        //if (array[mid]==target) 
        return true;
    }
    public boolean Find(int target, int [][] array) {
        for (int i=0; i<array.length; i++) {
            if (binarySearch(array[i],0,array[i].length-1,target)){
                return true;
            }
        }
        return false;
    }
}
//方法4
import java.util.*;
public class Solution {
    public boolean Find(int target, int [][] array) {
        int i=array.length-1,j=0;
        while (j<=array[0].length-1 && i>=0) {
        	int now= array[i][j];
            if (now==target) return true;
            if (now<target) j++;
            if (now>target) i--;
            /*
            不用if(array[i][j]<target) j++;因为如果对i和j进行了修改,影响后面的if
            否则的话,要写:
            if(arr[i][j]<target) j++;
            if (j<=array[0].length-1 && array[i][j]>target) i--;
             */
        }
        return false;
    }
}
class Solution:
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        if matrix==None or len(matrix)==0 or len(matrix[0])==0:
            return False
        
        i=len(matrix)-1;j=0;j_max=len(matrix[0])-1
        
        while (i>=0 and j<=j_max):
            t = matrix[i][j]
            if target==t: return True
            if target<t: i-=1
            if target>t: j+=1
        return False

** 技巧 **

从例子入手,看如何可以减少基础操作执行次数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值