二维数组中的查找
题目描述
在一个二维数组中(每个一维数组的长度相同)(设行数为m,列数为n)
每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解法一:暴力枚举
public boolean Find1(int target, int[][] array) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
if (array[i][j] == target) {
return true;
}
}
}
return false;
}
时间复杂度:O(m*n)
空间复杂度:O(1)
解法二:枚举每一行+二分查找
public static boolean Find2(int target, int[][] array) {
for (int[] nums : array) {
int head = 0, fail = array[0].length - 1, mid = (head + fail) / 2;
while (head <= fail) {
mid = (head + fail) / 2;
if (nums[mid] == target) {
return true;
} else if (nums[mid] < target) {
head = mid + 1;
} else {
fail = mid - 1;
}
}
}
return false;
}
时间复杂度:O( mlog(n) )
空间复杂度:O(1)
解法三&最优解?:对整个二维数组进行二分查找
思路:
- 取整个二维数组左下角的数,该数是其所在列最大的数,所在行最小的数
- 令该数与target比较,若相等则返回true
- 若target大于该数,则说明target不可能在该数所在列,削去该列
- 若target小于该数,同理削取该行
- 返回1,直至找到target,返回true; 或者所有 行/列 被削去,返回false
java实现:
public boolean Find(int target, int[][] array) {
int row = array.length - 1, column = 0; //左下角数字所在的行数和列数
while (row >= 0 && column <= array[0].length - 1) {
if (array[row][column] == target) {
return true;
} else if (array[row][column] < target) {
column++;
} else {
row--;
}
}
return false;
}
时间复杂度:O(m+n)
空间复杂度:O(1)