在一个二维数组中(每一个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。数组
由题目可知,该数组具有如下性质:从左到右升序,从上到下升序。把二维数组当作矩阵形式的话,也就是说每一个元素比左边的元素大,比右边的元素小,比上边的元素大,比下边的元素下。所以能够获得这么一个结论:当整数A大于该数组中的元素B时,那么A必然不在B的上方,也不在B的左方,只需往B的下方和右方查找便可;当整数A小于该数组中的元素B时,那么A必然不在B的下方和右方,只需往B的上方和左方查找便可。
既然知道了数组的这个性质,那么该如何应用它呢?如下图为例,假如要寻找的数是n,试一下从左上角第一个元素1开始搜索,若是n比1大,能够获得结论:若是数组内存在n的话,他必然在1的右方或下方,往这两个方向搜索便可。可是这个结论并不能帮助咱们,由于有两个搜索方向,不知道选哪一个。可是从左下角和右上角两个地方开始就不同了,以左下角为例,假如n大于左下角的元素7,那么根据数组的性质,n也大于7上边和左边的全部元素,7是左下角的元素,只有上方有元素,所以能够排除7上方全部的元素,既第一列的全部元素均可以排除掉;假如n小于7,那么因为7右边的全部元素都比7小,那么n必然比这些元素小,因此这一列的全部元素也均可以排除。能够发现,无论n比7大也好,比7小也好,均可以直接排除掉1行或1列的元素,所以最坏状况下的时间复杂度是m+n。函数
`spa
public class Solution { public boolean Find(int target,int [][] array){ int row = array.length; int col = array[0].length; int i = row-1; int j = 0; while(i>=0 && j< col){ if(target>array[i][j]){ j++; }else if(target<array[i][j]){ i--; }else{ return true; } } return false; }
}`code