二维数组中的查找
时间限制:1秒
空间限制:32768K
本题知识点:查找
数组
题目描述:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
(设行数为 m, 列数为 n)
解答一:
/**
*暴力解法 O(n)=m*n
*两重循环遍历数组
*/
public class Solution {
public boolean Find(int target, int [][] array) {
for(int i=0; i<array.length; i++){
for(int j=0; j<array[i].length; j++){
if(target == array[i][j]){
return true;
}
}
}
return false;
}
}
解答二:
/**
*二分法 O(n)=m*logn
*由于数组每行都是有序,对每行采用二分查找
*/
public class Solution {
public boolean Find(int target, int [][] array) {
for(int i=0; i<array.length; i++){
int low = 0;
int high = array[i].length - 1;
while(low <= high){
int mid = (low + high)/2;
if(target > array[i][mid]){
low = mid + 1;
}else if(target < array[i][mid]){
high = mid -1;
}else{ // 找到 target
return true;
}
}
}
return false;
}
}
解答三:
/**
*由于数组由上到下,由左到右递增(每个一维数组的长度相同)
*选取右上角元素或左下角元素为起始点
*以右上角开始为例:初始值 row = 0, col = array[0].length - 1;
*if(target < array[row][col]) col--; //(col >= 0)
*if(target > array[row][col]) row++; //(row <= array.length - 1)
*注意越界的终止条件,最终有 O(n)=m+n
*/
public class Solution {
public boolean Find(int target, int [][] array) {
int row = 0;
int col = array[0].length - 1;
while(row <= array.length - 1 && col >= 0){
if(target > array[row][col]){
row++;
}else if(target < array[row][col]){
col--;
}else{
return true;
}
}
return false;
}
}