牛骨文教育服务平台(让学习变的简单)
博文笔记

排序15:有序矩阵查找

创建时间:2017-05-02 投稿人: 浏览次数:369

题目:现在有一个行和列都排好序的矩阵,请设计一个高效算法,快速查找矩阵中是否含有值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]元素进行比较;如果x<a[0,m-1],说明x不在结点这一列中,于是从a[0,m-2]结点开始遍历,即通过将x与当前矩阵的右上角a[p,q]元素进行比较,如果x小,那么排除右上角结点所在列,即对q--;如果x大,那么排除右上角结点所在行,即进行p++,直到p>n-1或者q<0时结束。这样的时间复杂度是O(n+m)

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

import java.util.*;
//等同于Array1: 二维数组中的查找
public class 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;
    }
}



声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。