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