题目
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路1
直接遍历数组,逐个元素与target比较,找到就就返回 true
时间复杂度O(n^2)
思路2
有题意可知,该数组是有序的,所以可以使用二分查找
把每行当成一个一维数组,逐行进行二分查找。
时间复杂度为O(n*logn)
public class Solution {
public boolean Find(int target, int [][] array) {
if(array.length==0||array[0].length==0) return false;
for(int i=0;i<array.length;i++){
int left=0,right=array[0].length-1;
while(left<=right){
int mid=(left+right)/2;
if(array[i][mid]>target)
right=mid-1;
else if(array[i][mid]<target)
left=mid+1;
else
return true;
}
}
return false;
}
}
思路3
由题,从左到右是有序,从上到下是有序。
所以可以得知:
当target小于array[row][col]元素时,那么target必定在元素array所在行的左边,
即col–;
当target大于array[row][col]元素,那么target必定在元素array所在列的下边,
即row++;
public class Solution {
public boolean Find(int target, int [][] array) {
if(array.length==0||array[0].length==0) return false;
for(int row=0,col=array[0].length-1;row<array.length&&col>=0;)
{
if(array[row][col]==target)
return true;
else if(array[row][col]>target)
col--;
else
row++;
}
return false;
}
}
时间复杂度是O(n)
其他的题题解
剑指offer题解 java版