剑指offer之 二维数组中的查找

    在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如:给定一组二维数组数据:
[1,4,7]
[3,6,9]
[4,8,11]
数组的每一行从左往右依次增大。数组的每一列从上往下依次增大,求数组中是否存在目标数target。

解题思路:

该二维数组中的一个数,小于它的数一定在其左边,大于它的数一定在其下边。因此,可以先从右上角开始查找,根据 target 和当前元素的大小关系来缩小查找区间,当前元素的查找区间为左下角的所有元素。时间复杂度 O(M + N)。M是行,N是列。

代码实现:

/**
     * 经过row和line的初始化默认从右上角开始寻找,如果目标值大于右上角的值则往下寻找,小于则往左寻找
     * @param arr 输入的数组
     * @param target  目标值
     * @return  是否找到
     */
public static boolean search(int[][] arr,int target){
        //定义行,默认第一行
        int row = 0;
        //定义列,默认最后一列
        int line = arr[row].length-1;
        //定义是否找到标志位
        boolean flag = false;
        //如果行和列都未超过数组的界限,则一直寻找
        while (row <= arr.length-1 && line >=0){
            if(target == arr[row][line]){
                flag = true;
                break;
            }else if(target < arr[row][line]){
            	//列数减一也就是左移
                line--;
            }else if(target > arr[row][line]){
            	//行数加一也就是下移
                row++;
            }
        }
        return flag;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值