二维数组中的查找

题目描述

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

问题分析

如以下表格,我们把它当成一个为维数组。它的特征是从左到右递增,从上到下递增。

1289
24912
471013
681115

首先我们需要寻找一个切入点来遍历二维数组,那么我们会考虑选择四个角1,9,6,15的位置。1是二维数组中最小的,15是二维数组中最大的,可能很多人会首先选择这两个的一个来作为遍历的起点。

假如我们现在选择1来作为起点,若目标整数比1小或等于1,那我们可以直接得出结论。若目标整数比1大,那么我们既可以向右遍历,也可以向下遍历,这样就很麻烦了。选择15作为起点同理。

如果我们选择9或者6呢?如果选择6作为起点,若目标整数等于6则可得出结论,若目标整数比6小,那么6的这一行数都是比6大的,可以直接抛弃。若目标整数大于6,6的这一列都是小于目标整数的,则可以直接抛弃。

很明显,选择1或者15作为起点是十分尴尬的。接下来我们来分析一下,目标整数是5的情况。

6>5,抛弃6的这一行,向上遍历;

4<5,抛弃4的这一列,向右遍历;

7>5,抛弃7的这一行,向上遍历;

4<5,抛弃4的这一列,向右遍历;

9>5,抛弃9的这一行,向上遍历;

8>5,抛弃8的这一行,数组已遍历完,不存在5。

代码实现

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值