剑指offer--<二维数组查找>

来源:互联网 发布:acrobat reader mac 编辑:程序博客网 时间:2024/05/01 20:22

转载请声明源地址


听说,剑指offer那都是大牛干的活【偷笑】,我也凑个热闹,

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

有三个想法:

1.1 for循环遍历

1.2 for循环遍历优化版

2. 腾讯曾经的笔试题目(那个100层扔鸡蛋,扔玻璃球,扔......)【下篇博客再写】。

看到题目的时候,以前做过一维数组查找,一个for循环查找,二维数组要查找的话,一样,直接使用两个for循环,时间复杂度是o(n^2),说干就干。


存在的问题:

数组是自增数组,如何查找才时间复杂度才是最低的 ,这是优化的方向,想法2也是基于这个目的。

1.1 for循环遍历 

中心指导思想:遇到相同的文件就退出所有循环,将外循环加上标签,退出循环时,直接退出标签循环。


   public static boolean Find1(int target, int [][] array) {        int lenOfarray=array.length;        int lenOfRow=array[0].length;        Boolean flag=true;        outside:for (int i=0;i<lenOfarray;i++){for (int j=0;j<lenOfRow;j++){if (array[i][j]==target){flag=false;break outside;}}}return !flag;    }

附:牛客截图



1.2 for循环遍历

中心指导思想:遇到相同的文件就退出所有循环,将判断元素相同的条件加入到 循环判定条件中  ,这样一旦flag变化,判断条件也同样变化。

    public static boolean Find2(int target, int [][] array) {        int lenOfarray=array.length;        int lenOfRow=array[0].length;        Boolean flag=true;for (int i=0;flag && i<lenOfarray;i++){for (int j=0;flag && j<lenOfRow;j++){if (array[i][j]==target){flag=false;}}}return !flag;    }
附:牛客截图


源代码:GitHub:  https://github.com/johnlee2018/JZoffer.git

1 0