剑指offer—二维数组中的查找—1

题目描述

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

时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 热度指数:1644616

 

1、分析

本题属于数值的查找问题。对于查找问题,已经有多种常用的查找方法,比如针对有序的数组,采用二分查找,二分查找之所以快,源于其充分利用了数组的有序性,每次查找后把查找范围缩小到数值规模的一半。本题目中给定的数据也有一定的规律。每一行从左到右递增,每一列从上到下递增,所以每一行与每一列组成的“7”字形的数组也是有序的。根据这个规律,可以每次考虑一个“7”字形(第一次选取第一行和最后一列组成的7字形)的行列组合,以行列交叉点的数值作为参考值reference,用目标值target与reference进行比较。如果target小于reference,则target不可能出现在“7”字形的列;如果target大于reference,则target不可能出现在“7”字形的行,由此可知,每次比较,把数组的查找范围缩小一行或者一列,所以时间复杂度是O(max(m,n)),其中m和n分别代表行数和列数。

 

2、代码

public class Solution {
    public boolean Find(int target, int [][] array) {
        boolean result = false;
        int row = array.length - 1;
        int col = array[0].length - 1;
        for(int i = 0,j = col;i<=row&&j>=0;){
            if(array[i][j] == target){
                result = true;
                break;
            }else if(array[i][j] > target){
                j--;
            }else if(array[i][j] < target){
                i++;
            }
        }
        return result;
    }
}

PS:

(1)当找到array[i][j] ==target时,需要break终止;

(2)数组大小用length属性,不是size()和length()方法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值