题目:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:如果用暴力遍历方法的时间复杂度为O(m*n),这样算法显然没有利用到二维树每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序的特性,如下面所示的二维数组。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eMnjXStK-1623546938805)(C:\Users\93432\AppData\Roaming\Typora\typora-user-images\image-20210612094825180.png)]
我们不妨将其以右上角的顶点为轴向右旋转45度,看作一棵二叉树。
这就是一棵顺序二叉树,从根节点开始遍历,如果根节点的值比目标值大,就往左走,如果根节点的值比目标值小,就往右走,如果相等,就返回true,什么时候退出遍历呢,当走到NULL位置的时候,代码如下。
class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { int i=matrix.length-1,j=0; while(i>=0 && j<matrix[0].length){ if(matrix[i][j]>target)i--; else if(matrix[i][j]<target)j++; else return true; } return false; } }