数据结构与算法分析笔记与总结(java实现)--数组1:二维数组中的查找

Array1:二维数组中的查找

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

思路:这是一个二维数组的问题,二维数组题目很少,就这个几个,套路比较简单,理解记住即可。二维数组结构是一个矩阵,爱在思考时从矩阵结构上面进行思考。已知矩阵每一行从左到右递增,每一列从上到下递增,可以得知一个结论:对于任意一个点,它的右边和下边总是比他大(不是右边且下边),他的左上角总是比他小,因此如果对于矩阵中间的某个结点node,如果val>node说明val在node的右边或者下边,如果val<node说明val在node的左下角,这样在每次判断后并没有减少查找范围,因此无法逐步解决问题,因此对于比较的点需要好好选择,这里应该选择左下角或者右上角的点node作为与val比较的点,从右上角开始,如果val<node,那么说明val在node所在列就不用考虑了,这一列一定比node大,因此下一次的搜索范围是array[i][j--];如果val>node,那么说明node的所在行不用考虑了,因为node所在行一定比node小,因此下一次的搜索范围是array[i++][j],以此类推,直到val==node表示找到了,或者i,j越界表示找不到。这里可以使用while循环或者递归来实现。此时时间复杂度是O(m+n),奥暴力遍历法的时间复杂度是O(mn)

特殊输入:数组为null;数组为空数组,注意空数组int array[][]=new int[0][0];他不为null,只是长度为0,要特殊处理

常识:已知一个数组,那么数组的长度可以直接通过属性length来得到,不占用时间复杂度,这是数组的一个属性。

/*

给定一个每行每列排序的二维数组,判断这个数组中是否存在指定的值target,时间复杂度为O(m+n);

这里又发现一个bug,在注释处访问array[i][j]时牛客oj就数组越界异常,提示样例为16,[[]]时报数组越界。但是相同代码在eclipse上和LeetCode的oj上测试都没有问题。在视频题目Sort12:有序矩阵查找练习题上提交也没有问题。

*/

public class Solution {

    public booleanFind(int target, int [][] array) {

        //特殊输入

        if(array==null)return false;

       //求出数组的长度

        introwLength=array.length;

        //特殊输入,数组长度为0

       if(rowLength==0) return false;

        intcolumnLength=array[0].length;

        //定义右上角的点node用于比较val

        int i=0;

        intj=columnLength-1;

        //int node=array[i][j];             --bug

        //循环比较或者递归比较

       while(i<=rowLength-1&&j>=0){

           if(target==array[i][j]) return true;

            elseif(target>array[i][j]){

                i++;

            }else{

                j--;

            }

        }

        //执行到这里表示没有找到

        return false;

    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值