题目链接:二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:
数组的特点是从上到下有序,从左到右有序,一般有序的查找,都会联想到二分查找,我们也可以用二分查找试试看,我用二分查找思路,写了好久。发现无法解决,而且代码越来越长,毫无头绪。看了别人的题解之后不禁感叹,在此分享给大家。这是题解的链接题解
简单描述一下他的解法,是将整个二维数组抽象成一颗二叉搜索树,从左上角(类似于root结点)开始遍历整个数组,如果当前值nums[i][j]的值大于target则向左移动,如果当前值nums[i][j]的值小于target则向下移动,如果相等就返回 true,退出循环遍历的时候,就返回false;
代码展示:
class Solution {
public boolean findNumberIn2DArray(int[][] nums, int target) {
int rowLen = nums.length;
if(rowLen ==0) return false;
int colLen = nums[0].length;
int i = 0 , j = colLen-1;
while(true){
if(i>rowLen-1 || i < 0 || j<0 || j>colLen-1) break;
if(nums[i][j]==target) return true;
else if(nums[i][j]>target) j--;
else if(nums[i][j]<target) i++;
}
return false;
}
}
不得不说,由这道题联想到了二叉搜索树,这个方法非常巧妙。