数据结构与算法分析笔记与总结(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]元素进行比较;如果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个结点进行比较即可作出判断。

importjava.util.*;

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

publicclass Finder {

    pu

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值