剑指offer(一) 二维数组中的查找

二维数组中的查找-数组

题目描述

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

思路

该二维数组是按照每行从左往右自增、每列从上到下递增的顺序排列的。
所以可以考虑先从第一行开始遍历每一行的第一个元素,并不断与target进行比较,停在不小于target的那一行,记为i;
从第i-1行开始,行数递减地遍历每一行小于target的每个元素。
在遍历过程中,如果遇到与target相同的元素,直接结束查找,返回true。

题解

public class Solution {
    public boolean Find(int target, int [][] array) {
        if(array==null)
            return false;
        int i=0,j=0,k=0;
        int m=array.length,n=array[0].length;
        if(m<=0||n<=0)
            return false;
        for(;i<m&&array[i][0]<target;i++);
        if(i<m&&array[i][0]==target)
            return true;
        for(k=i-1;k>=0;k--){
            for(j=1;j<n&&array[k][j]<target;j++);
            if(j<n&&array[k][j]==target)
                return true;
        }
        return false;
    }
}

反思

在几次编译过程中都出现了数组越界的报错,但是我是增加了数组边界检查的代码。经过多次检查,才发现是&&连接的两个条件式的顺序问题。

条件式1 && 条件式2

如果1为false,则2不执行。
所以应该将边界检查放在1,判断是否相等放在2,才不会造成数组越界。

思路扩展

要尽可能缩短搜索的范围,而且尽可能是范围是一整块。
可以考虑从最右一列进行筛选,从第一行开始依次将target跟最右一列的值进行比较,如果target>最右的值,则target肯定不在这一行的范围内,行数递增。
直到target<=最右的值,在满足该条件的行内进行筛选。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值