二维数组中的查找

本文介绍了如何在二维有序数组中使用二分查找算法寻找目标值。通过行遍历数组并针对每一行进行二分查找,如果找到目标值则返回true,否则返回false。在开始查找之前,必须先判断二维数组是否为空,Java中可以通过检查数组地址、长度及子数组长度来实现。

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

链接:https://www.nowcoder.com/questionTerminal/abc3fe2ce8e146608e868a70efebf62e?orderByHotValue=1&questionTypes=000100&page=1&onlyReference=false
来源:牛客网

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

分析:昨天刚好刷了leetcode上的167. Two Sum II - Input array is sorted,数组有序,采用二分查找。这道题的二维数组也是有序的,所以很快就想到了采用二分查找算法。

基本思想是:行遍历二维数组,对每一行进行一次二分查找,直到找到目标值,直接返回true;否则返回false。使用flag作为标志位,初始值为false。外层循环进行行遍历,二位数组行数为array.length,因为二维数组每一行都是从左到右递增的,所以首先判断该行的最后一个数(该行的最大数)是否小于target(即array[i][array[i].length - 1] < target),若小于target,则在该行一定找不到target值;否则的话就对该行进行二分查找,查找是否等于target,一旦找到就设置flag=true,并返回flag的值;否则继续判断下一行是否存在该整数,直至循环结束,返回flag的值(若循环结束都未找到,则flag一直为false)。

注意:开始查找前要判断二维数组是否为空。

java中判断数组为空,要检查三个部分:

一是数组首地址是否为空

二是是否为{},也就是array.length==0的情况

三是{{}},这时array.length=1,但是array[0].length==0。满足任意一个条件就可以返回false了。

if(array==null||array.length==0||(array.length==1&&array[0].length==0)) return false;

判断二维数组是否为空参考:http://www.cnblogs.com/daneres/p/6507535.html

public class Solution {
    public boolean Find(int target, int [][] array) {
        if(array == null||array.length == 0||(array.length == 1 && array[0].length == 0))
            return false;
        int j = 0;
        boolean flag = false;
        for(int i = 0;i < array.length;){
            if(array[i][array[i].length - 1] < target){
                i++;
            }
            else{
                int bottom = 0;
                int top = array[i].length - 1;
                while(bottom <= top){
                    int mid = (bottom + top)/2;
                    if(array[i][mid] < target)
                        bottom = mid + 1;
                    else if(array[i][mid] > target)
                        top = mid - 1;
                    else
                        return true;
                }
                i++;
            }
        }
        return flag;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值