牛客网剑指offer 二维数组的查找

题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

解题思路

该题有很多种解法,第一眼看过去,发现这个二维数组是有规律的,于是就排除了暴力解法。

每一行都是排好序了的,这又是个查找问题,于是我又想到了二分查找,这种解法的时间复杂度为O(nlogn);虽然可以过,但效率并不是很高。

还有一种解法,这个想法同样是由二分查找引起的。

二分查找是这样实现的

if(target  <   arr[mid]){
//找左边
。。。。。。。
}else if(target > arr[mid]){
//找右边
。。。。。
}else{
//找到了
。。。。
}

于是我就在想能不能实现大于目标向一个方向,小于目标向一个方向,最后我将目标锁定在了右上角,当目标太大时,我就找下边,当目标太小时,我就找左边,这样找的话,最后的时间复杂度只有O(m+n);这应该就是最优解了吧。代码如下:

 1 public boolean Find(int target, int [][] array) {
 2         int row=array.length;
 3         int col=array[0].length;
 4         int i=0,j=col-1;
 5         while(i<row&&j>=0){
 6             if(array[i][j]>target){
 7                 j--;
 8             }else if(array[i][j]<target){
 9                 i++;
10             }else{
11                 return true;
12             }
13         }
14         return false;
15     }

同理的,如果你将起始点设在左下角的话,也可以得到相同的效果,可以试一试。

原文地址:https://www.cnblogs.com/swust-wangyf/p/7663242.html