一:问题描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
二:题目求解
解法一:暴力解法,遍历每一行每一列进行比较,时间复杂度mxn(m为行数,n为列数)
具体实现略
解法二:
用二维数组由上到下,由左到右递增的规律,那么选取左下角或者右上角的元素a[i][j]与target进行比较,当target大于元素a[i][j]时,那么target必定在元素a所在行的右边,即j++;当target大于元素a[i][j]时,那么target必定在元素a所在列的上边,即i--;时间复杂度O(m+n)。
Java代码具体实现:
//与左下角元素进行比较
public class Solution {
public boolean Find(int target, int [][] array) {
if(array.length==0||array[0].length==0){
return false;
}//注意非法判断
int rows=array.length;
int cols=array[0].length;
int p1=rows-1;
int p2=0;
while(p1>=0&&p2<cols){
if(target>array[p1][p2]){
p2++;
}else if(target<array[p1][p2]){
p1--;
}else{
return true;
}
}
return false;
}
}
-------------------------------------------------------------------------------------------
//与右上角元素进行比较
public class Solution {
public boolean Find(int target, int [][] array) {
if(array.length==0||array[0].length==0){
return false;
}//注意非法判断
int rows=array.length;
int cols=array[0].length;
int p1=0;
int p2=cols-1;
while(p1<rows&&p2>=0){
if(target>array[p1][p2]){
p1++;
}else if(target<array[p1][p2]){
p2--;
}else{
return true;
}
}
return false;
}
}
解法三:对每一行进行二分查找
Java代码具体实现
//对每一行都进行二分查找,时间复杂度O(mlogn)
public class Solution {
public boolean Find(int target, int [][] array) {
if(array.length==0||array[0].length==0){
return false;
}//注意非法判断
int rows=array.length;
int cols=array[0].length;
for(int i=0;i<rows;i++){
int left=0;
int right=cols-1;
while(left<=right){
int mid=(left+right)/2;
if(target>array[i][mid]){
left=mid+1;
}else if(target<array[i][mid]){
right=mid-1;
}else{
return true;
}
}
}
return false;
}
}