剑指offer_1_二维数组中查找
2020-01-20 本文已影响0人
韩who
/**
* 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,
* 每一列都按照从上到下递增的顺序排序。
* 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
*/
首先是先模拟获取随机递增数组
public static int[][] getArray(int n, int m){
//n代表行数,m为列数
int [][] arr = new int[n][m];
//初始化第一行
arr[0][0] = new Random().nextInt(n)+1;
for(int i = 1 ; i<m;i++){
arr[0][i] = arr[0][i-1]+new Random().nextInt(n)+1;
}
//初始化第一列
for(int j=1; j<n;j++){
arr[j][0] =arr[j-1][0]+new Random().nextInt(n)+1;
}
//让接下来的每一个数都等于他时正上或者左边两者中较大者,再加上随机数
for(int k = 1 ;k <n;k++) {
for(int j = 1; j<m;j++){
arr[k][j] = Math.max(arr[k-1][j],arr[k][j-1]) + new Random().nextInt(n)+1;
}
}
//打印出改数组
for (int i = 0; i<n ;i++){
for(int j = 0; j<m;j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
return arr;
}
解法一:
//使用矩阵向下搜索
//那么选取右上角或者左下角的元素a[row][col]与target进行比较,
public static boolean Find2(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])
return true;
else if(target>array[row][col])
row++;
else
col--;
}
return false;
}
解法二:
//使用二分查找遍历一行一行地遍历该数组
public boolean Find(int [][] array,int target) {
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
return true;
}
}
return false;
}