一. 题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
二. 思路方法
(1)直接暴力解答,也就是说求出二维数组的行和列,然后遍历即可。
(2)二分法查找,求出行列以后,对每一行或者每一列进行二分查找。
(3)从右上角或左下角开始找,逐行的查找。
三. 代码实现
(1)暴力解法
public class Solution {
public boolean Find(int target, int [][] array) {
if(array == null)
return false;
int col = array.length; //行数
int li = array[0].length;//列数
for(int i = 0 ; i < col; i++){
for(int j = 0 ; j < li ; j++){
if(array[i][j] == target)
return true;
}
}
return false;
}
}
(2)二分实现
public class Solution {
public boolean Find(int target, int [][] array) {
if(array == null)
return false;
int col = array[0].length-1;
int mid = 0 ; //中值
for(int i = 0 ; i < array.length ; i++)
{
int low = 0;
int high = col;
while(low <= high){
mid = (low+high)/2;
if(array[i][mid] == target){
return true;
}
if(array[i][mid] > target){
high = mid -1;
}else{
low = mid + 1;
}
}
}
return false;
}
}
(3)“右上角”解法
public class Solution {
public boolean Find(int target, int [][] array) {
if(array == null)
return false;
int row = 0;
int col = array[0].length-1;
while(row < array.length && col >= 0){
if(array[row][col] == target){
return true;
}
if(array[row][col] > target){
col--;
}else{
row++;
}
}
return false;
}
}