剑指Offer_3_二维数组中的查找

题目描述

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

解题思路
发现规律:

1.首先选取数组中右上角的数字。如果该数字等于key,查找过程结束
2.如果该数字大于key,则删除这个数字所在的列(因为该列所有元素都比key大)
3.如果该数字小于key,则删除这个数字所在的行(因为该行所有元素都比key小)

也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围中删除一行或一列,
这样每一步都可以缩小查找范围,知道找到要查找的数字,或者查找范围为空。

代码实现

public class ArraySearch
{

    public static boolean findElementInArray(int[][] array, int key)
    {
        if (array == null)
            return false;

        int startCol = array[0].length - 1;
        for (int i = 0; i < array.length; i++)
        {
            for (int j = startCol; j > 0; j--)
            {
                System.out.println("查询位置:(" + i + "," + j + ")");
                // 如果当前数字大于key,则删除此列
                if (array[i][j] > key)
                {
                    // 删除过得列,不需要再查找,下次循环时从新的起始列开始查
                    startCol -= 1;
                    continue;
                }
                // 如果当前数字小于key,则删除此行
                else if (array[i][j] < key)
                    break;
                else
                {
                    return true;
                }
            }
        }

        return false;
    }

    public static void main(String[] args)
    {
        //Integer[][] array = new Integer[row+1][col+1]; // 这里为什么要多一个 不然会报错?
        int[][] array = new int[][]{
                {1, 2, 8, 9},
                {2, 4, 9, 12},
                {4, 7, 10, 13},
                {6, 8, 11, 15}
        };

        for (int i = 0; i < array.length; i++)
        {
            for (int j = 0; j < array[i].length; j++)
            {
                System.out.print(array[i][j] + " ");
            }
            System.out.println("");
        }

        System.out.println("===================");
        System.out.println("Result:" + findElementInArray(array, 15));
    }
}

补充
同样,我们可有选取左下角的数字。但是不能选择左上角和右上角,因为既不能删除行,也不能删除列。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值