牛客网剑指offer编程题--二维数组中的查找

前记:笔者现在是某理工高校研三学生,实验室老板年纪大了,处于放养状态。而我也是一个不甘于平庸的人,从硕士开始就开始学习软件开发(作者本科硕士都是偏硬件专业)。研一上完课就开始实习(16年7月开始),先后在oracle、新浪微博、百度工作。由于种种原因,三家单位都没能留下。本想着有着大厂的实习经历,校招很容易的。结果投了几家并不太牛逼的互联网公司,全部挂在笔试上。曾经学过得数据结构的算法忘得干干净净(工作太忙,基本没有刷题)。看着身边的优秀同学都签了工作,心里实在不是滋味。痛定思首,决定从牛客网开始刷起。

给看博文的同学一个建议,如果读者情况和我一样,千万记住。从6月份开始就要准备刷题,再加上牛逼的工作经历,你会很幸运的。切不可仅仅实习而拉下了刷题

题目描述

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

利用暴力的方法双重遍历肯定可以解决问题,但是不是最优解。因为二维数组是有序的,(行列都是有序数据),也就是说位于矩阵左下角的元素肯定都是大元素。从最后一行数据开始判断。

如果当前行的第一个数据都大于目标元素的数据,则这一行后面的数据肯定都大于目标元素数据。就可以直接进入上一行数据遍历,这样就减少了程序的执行次数。(对应程序中的high。边界条件是high小于0)

如果当前行的第一个数据都小于目标元素的数据,说明目标数据肯定在这一行中,直接往后执行即可,即执行当前行数据的遍历即可,如果本行数据中没找到目标元素,则说明矩阵中不存在目标数组。(对应程序中的i,边界条件是大于一行的长度)

如果找到目标数据(相等),返回true。

代码:

public class Solution {
    public boolean Find(int target, int [][] array) {
int high = array.length - 1;
        int i =0;
        while(hight >= 0 && i < array[0].length){
            if (array[high][i] > target) {
                high--;
            } else if (array[high][i] < target) {
                i++;
            } else {
                return true;
            }
        }
        return false;
    }
}

你可能感兴趣的:(笔试算法)