题目描述
来自《剑指offer》的原题,但是实现了两种方法并对时间效率进行了测试。
解题思路
第一种 – 二维矩阵中的二分法
这种方法思路跟剑指offer原文中的思路相似
step1: 规定矩阵size ⇒ (m, n)
step2: 建立坐标点上下限 ⇒ x = (0,m-1), y = (0,n-1)
step3: 通过二分法逐步确定我们所选取点的坐标,比如第一步为((0 + m-1)/2, (0 + n-1)/2)
step4: 通过对比target数值,确定下一步的搜索范围
如果data[i][j] = target,则返回true
如果data[i][j] > target,则除去{ x1>i, y1>j| (x1,y1)}的点都要搜索 ⇒ 返回step3
如果data[i][j] < target,则除去{ x1<i, y1<j| (x1,y1)}的点都要搜索 ⇒ 返回step3
代码
public static boolean Find(int target, int [][] array) {
return Find(target, array, 0, array.length-1, 0, array[0].length-1);
}
public static boolean Find(int target, int[][] array, int xs, int xe, int ys, int ye){
if(xs>xe || ys>ye) return false;
int xm = (xs+xe)/2;
int ym = (ys+ye)/2;
if(array[xm][ym]==target){
System.out.println(xm + " " + ym);
return true;
}else if(array[xm][ym]>target){
return Find(target, array, xs, xm-1, ym, ye)||
Find(target, array, xs, xe, ys, ym-1);
}else{
return Find(target, array, xm+1, xe, ys, ym) ||
Find(target, array, xs, xe, ym+1, ye);
}
}
时间效率
在牛客网的剑指offer刷题中测试时间为:173ms
第二种 – 剑指offer中的思路
思路
摘自剑指offer
代码
public static boolean findByMethod2(int[][] data, int target){
if (data==null || data.length==0 || data[0] == null || data[0].length == 0){
return false;
}
int m=data.length, n=data.length;
int i=0, j=n-1;
while (j>=0 && i<m){//----!!
if (data[i][j] == target){
System.out.println(i + " " + j);
return true;
}else if (data[i][j] > target){
j-=1;
}else {
i+=1;
}
}
return false;
}
时间效率
在牛客网的剑指offer刷题中测试时间为:150ms