剑指Offer-二维数组中的查找

本文探讨了一个二维数组查找问题,数组的每一行和每一列都按照递增顺序排列。通过对比初步解题思路与最优解,阐述了如何高效地判断一个整数是否存在于这样的数组中。最优解采用while循环,从数组的左下角开始,根据目标值与当前值的比较,决定是向上还是向右移动,直至找到目标值或确定不存在。

题目描述

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

初步解题思路:一开始总想着数组有顺序,所以此题有捷径,但却越想越绕。想一开始就确定出target在数组中的左下边界,所以使用了两个for循环来确定。for循环有一个缺点,无法判断出数组是否为空数组,所以要在开始时先判断。思路太复杂,不精简,代码冗余度高。
最优解:使用while循环,不需要额外判定空数组,过程与走迷宫相似。从数组左下角开始,target比当前数大就右移,比当前数小就上移。

Java初步解题

public class Solution {
    public boolean Find(int target, int [][] array) {
        int i,j;
        int endx=0, endy=0,a=0;
        if((array==null||array.length==0)||(array.length==1&&array[0].length==0))
            return false;
        int x = array.length;
        int y = array[1].length;
        if(target < array[0][0] || target> array[x-1][y-1])
            return false;
        for(i=0;i<y;i++) {
            if (target <= array[x - 1][i]) {
                endy = i;
                break;
            }
        }
        for(j = x-1;j>=0;j--){
            if(target <= array[j][endy])
                if(target == array[j][endy])
                    return true;
                else {
                    if(j==0)
                        return false;
                    else{
                        endx = j - 1;
                        break;
                    }
                }
        }
        a = endy;
        for(i = endx; i>=0;i--){
            for(j = endy;j<y;j++){
                if(target == array[i][j])
                    return true;
                if(target < array[i][j])
                    break;
                if(target > array[i][j]){
                    a += 1;
                    if(a>=y)
                        return false;
                }
            }
            endy = a;
            if(i!=0 && target > array[i-1][y-1])
                return false;
        }
        return false;
        }
}

最优解:

public boolean Find(int target, int [][] array) {
    int rows = array.length;
    int cols = array[0].length;
    int i=rows-1,j=0;
    while(i>=0 && j<cols){
        if(target<array[i][j])
            i--;
        else if(target>array[i][j])
            j++;
        else
            return true;
    }
    return false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值