剑指offer:二维数组中的查找

前言

       剑指offer是非常经典的算法面试题,之前在牛客网上做过一遍,现在做第二遍并且分析记录。博客中还会出现数据结构和经典算法的篇幅,但是剑指offer单独拿出来,总共60多个题,分析一下,到时候也可以给师弟网友学习过程中作为参考。我自己也能熟悉面试题,巩固算法知识,保持编程状态。

二维数组中的查找

题目

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

分析

       遍历数组能解决问题,但是由于所给数组已经部分排序,我们可以利用这个排序规则进行不必要的比较剔除,进行优化。试想如果起点是左下角,同目标值比较,如果大于目标值,整行我们就不用比较了,如果小于目标值,本行之前也都不用比较了。

实现

       以右上角为起点,代码如下:

public boolean Find(int target, int [][] a) {
    // 右上角初始值,第一行最后一列。
    int j=a[0].length-1;
    int i=0;
    //循环条件
    while((j>=0)&&i<a.length){
        //大于目标值,该行之后肯定都大于目标值,只会在该行,减少列数查找
        if(a[i][j]>target)
            --j;
        //小于目标指,则该行全小于目标值,往下一行查找
        else if(a[i][j]<target)
            ++i;
        //相等返回true
        else
            return true;
    }
    //循环结束还未返回true,则返回false。
    return false;
}

       以左下角为起点,代码如下:

    public boolean Find(int target, int [][] a) {
    //左下角初始值,最后一行,第一列
    int i=a.length-1;
    int j=0;
    //循环条件
    while((i>=0)&&j<a[0].length){
        //大于目标值则该行都大于目标值,往上一行查找。
        if(a[i][j]>target)
            --i;
        //小于目标值,则该行之前都小于目标值,结果只会在该行,再增加列数查找
        else if(a[i][j]<target)
            ++j;
        //相等返回true
        else
            return true;
    }
    //循环结束还未返回true,则返回false。
    return false;
}