博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
排序15:有序矩阵查找
阅读量:3731 次
发布时间:2019-05-22

本文共 1201 字,大约阅读时间需要 4 分钟。

题目:现在有一个行和列都排好序的矩阵,请设计一个高效算法,快速查找矩阵中是否含有值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;    }}

转载地址:http://uxzin.baihongyu.com/

你可能感兴趣的文章
DRF之过滤排序组件
查看>>
DRF之分页组件
查看>>
DRF之异常处理组件
查看>>
DRF之自动生成接口文档
查看>>
一文搞懂Celery
查看>>
django接入qq登陆
查看>>
FastDfs
查看>>
最简明的冒烟测试
查看>>
最全,最简明的图文算法总结
查看>>
购物车流程
查看>>
支付宝支付流程
查看>>
Python调用笔记本电脑摄像头
查看>>
交换机工作原理
查看>>
路由器工作原理
查看>>
一文搞懂RabbitMq
查看>>
js实现点名系统
查看>>
Tornado入门必看1
查看>>
tornado入门必看2
查看>>
hash文件校验
查看>>
tornado异步协程
查看>>