数据结构与算法分析笔记与总结(java实现)--排序11:有序矩阵查找练习题

题目:现在有一个行和列都排好序的矩阵,请设计一个高效算法,快速查找矩阵中是否含有值x。给定一个int矩阵mat,同时给定矩阵大小nxm及待查找的数x,请返回一个bool值,代表矩阵中是否存在x。所有矩阵中数字及x均为int范围内整数。保证n和m均小于等于1000。测试样例:[[1,2,3],[4,5,6],[7,8,9]],3,3,10返回:false

思路:等同于Array1: 二维数组中的查找。常识二维数组的写法不要忘记。已知每一行是有序的,每一列也是有序的,最直接的思路是对全部元素进行遍历,时间复杂度显然是O(n*m);这里要利用每行每列有序这个特性来简化问题,从右上角元素开始遍历,如果结点x>a[0,m-1],说明x不在结点这一行中,于是下一次从a[1,m-1]元素进行比较;如果xn-1或者q<0时结束。这样的时间复杂度是O(n+m)

即最多只需要与n+m个结点进行比较即可作出判断。

importjava.util.*;

//等同于Array1: 二维数组中的查找

publicclass Finder {

    public boolean findX(int[][] mat, int n,int m, int x) {

       //特殊输入

        if(mat==null) return false;

      //求出数组的长度

        int rowLength=mat.length;

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

        if(rowLength==0) return false;

        int columnLength=mat[0].length;

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

        int i=0;

        int j=columnLength-1;

        //int node=mat[i][j];

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

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

            if(x==mat[i][j]) return true;

            else if(x>mat[i][j]){

                i++;

            }else{

                j--;

            }

        }

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

        return false;

    }

}

你可能感兴趣的:(数据结构与算法(java实现))