二维数组中的查找

二维数组中的查找

题目
题目:在一个二维数组中,每一行都按照从左到右的顺序进行了排序,每一列都按照从上到下进行了排序。
输入这样的一个二维数组arr和一个整数k,判断数组中是否存在这个数。

思路
1: 从左上角开始依次遍历寻找,时间复杂度o(n)
2: 利用题目信息,从左到右,从上到下有序。在右上角的值在该所在的行是最大的,在所在的列是最小的,将该值与目标数对比,如果大于目标数,则直接去除该行则可以了(因为它本身就是所在行最大的数了)。如果小于目标数,则直接去除该列。相等直接返回即可。
3: 左下角也是可以的,原理同右上角。为啥左上和右下角不可以,因为左上角在该行或该列都是最小的,一次比较只能排除本身,并不能直接排除整行或整列。右下角也是如此。

测试用例
1) 二维数组中包含要查找的数字(例如最大值、最小值、中间的值)
2)二维数组中不包含要查找的数字,会有如下三种情况:
2.1)要查找的值小于二维数组中的最小值
2.2)要查找的值大于二维数组中的最大值
2.3)要查找的值在二维数组的最大值与最小值之间但是不存在此值。
3)特殊输入测试(空数组)

实现代码

public class Solution {
    //从右上角开始排除(也可以从左下角开始)
    //因为右上角的数是在该行是最大,列最小,可以快速去除某一行或某一列
    public boolean Find(int target, int [][] array) {
        if(array.length <= 0)
            return false;

        int rows = array.length;
        int columns = array[0].length;
        int row = 0;                        //定位到右上
        int column = columns - 1;            

        while(row < rows && column >= 0){
            if(array[row][column] == target){            //匹配到则返回true
                return true;
            }
            else if(array[row][column] > target){       //右上角的值大于目标值,则除去这一列
                column--;
            }
            else{                            //右上角的值小于目标值,则除去这一行
                row ++;
            }
        }

        return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值