转载请声明源地址
听说,剑指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