二维数组:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
方式一
根据二维数组的最右上角为一个开始点,开始查找,判断需要查找的数字是大于当前位置上的数字还是小于,如果是大于,则向下查找,行数加1;如果是小于则向左查找,列数减1
从二维数组中查找对应的数字,判断是否存在
/**
* 二维数组中查找对应的数字是否存在
* 二位数组中从左到右数字增大
* 从上到下数字增大
* @param target
* @param array
* @return
*/
public static boolean find(int target, int[][] array) {
if (array.length == 0 || array[0].length == 0) {
return false;
}
int m = array[0].length - 1;// 列
int n = 0;// 行
int temp = array[n][m];// 第0行的最后一个
while (target != temp) {
if (m > 0 && n < array.length - 1) {
// 如果需要查找的target大于当前找到的temp,则向下继续查找
// 行数加1
if (target > temp) {
n = n + 1;
} else if (target < temp) {
// 如果需要查找的target小于当前找到的temp,则向左边查找
// 列数减1
m = m - 1;
}
temp = array[n][m];
} else {
return false;
}
}
return true;
}
方式二
遍历每一行,然后对每一行使用二分查找法。时间复杂度为O(nlogn)
二分查找的时间复杂度为O(logn),前提是有序的时候
public static boolean find1(int target, int[][] array) {
if (array.length == 0 || array[0].length == 0) {
return false;
}
// 遍历每一行
for (int i = 0; i < array.length; i++) {
int low = 0;
int height = array[i].length - 1;
int mid = (low + height)/2;
while (low<=height) {
if (array[i][mid] > target) {
height = mid - 1;
} else if (array[i][mid] < target) {
low = mid + 1;
} else {
return true;
}
}
}
return false;
}
网友评论