二维数组中的查找(剑指offer)_学习记录
【题目描述】
在一个二维数组中(每个一维数组的长度相同), 每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
e.g.
【算法实现】
package p43;
/**
* 二维数组的查找算法实现
* @author Guozhu Zhu
* @date 2018/10/5
* @version 1.0
*
*/
public class Demo01 {
/* ========== Test ========== */
public static void main(String[] args) {
int[][] array = {{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
boolean res = searchInArray2(array, 3); //1.利用性质实现
System.out.println(res);
}
//利用性质求解, 时间O(n)=m+n(m为行n为列), 空间O(n)=1;
public static boolean searchInArray1(int[][] array, int target) {
int row = 0;
int col = array[0].length-1;
while (row < array.length && col >= 0) {
if (array[row][col] > target) {
col--;
} else if (array[row][col] < target) {
row++;
} else {
return true;
}
}
return false;
}
//利用二分查找求解, 时间O(n)=mlogn, 空间O(n)=1;
public static boolean searchInArray2(int[][] array, int target) {
for (int i = 0; i < array.length; i++) {
int low = 0;
int high = array[i].length-1;
int mid = 0;
while (low <= high) {
mid = (low+high) / 2;
if (array[i][mid] > target) {
high = mid-1;
} else if (array[i][mid] < target) {
low = mid+1;
} else {
return true;
}
}
}
return false;
}
}
分析:只有当m < n时,二分算法的时间复杂度才比利用性质算法的时间复杂度低。