剑指offer之:二维数组中的查找
题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
数组不一定等长
方法一:暴力求解
遍历,然后挨个比较就可以了
public class Solution {
public boolean Find(int target, int [][] array) {
int m = array.length;
for(int i=0; i<m; i++){
for(int j=0;j<array[i].length;j++){
if(array[i][j]==target)
return true;
}
}
return false;
}
}
方法二:对每一行使用二分查找
public class Solution {
public boolean Find(int target, int [][] array) {
int i;
int m = array.length;
for(i=0;i<m;i++){
if (binFind(target, 0, array[i].length -1, array[i])) {
return true;
}
}
return false;
}
public static boolean binFind(int n,int low,int heigh,int[] arr){
if(low>heigh)
return false;
int mid = (low + heigh)/2;
if(arr[mid]>n){
return binFind(n, low, mid - 1, arr);
}
if(arr[mid]<n){
return binFind(n, mid + 1, heigh, arr);
}
return true;
}
}
方法三:找规律
找到矩阵的左下角或右上角
以左下角为例:向上走的变小,向右走则变大
public class Solution {
/*
* 1 4 7
* 2 5 8
* 3 6 9
*/
public boolean Find(int target, int [][] array) {
int m = array.length;
int i = m -1;
int j = 0;
while(i >= 0 && j < array[i].length){
if(array[i][j]==target){
return true;
}else if (array[i][j]>target) {
i--;
}else {
j++;
}
}
return false;
}
}