《剑指offer》面试题3:二维数组的查找(java
实现)
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
——来源于《剑指offer》
解题思路
选取左下角或者右上角的元素与输入的整数进行比较,如果相等就返回,否则就剔除相应的行或者列再重复上面操作。
- 利用递归实现:
class FindPartaillySortedMatrix {
// 测试数组
public static int[][] sortedMatrix = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 }, { 6, 8, 11, 15 } };
public static boolean isFind = false;
public static void solution(int[][] arr, int i, int j, int a) {
// 递归终止条件
if (i > arr.length - 1 || j < 0) {
return;
}
// 获取右上角元素
int tmp = arr[i][j];
if (tmp > a) {
// 剔除最右边一列
solution(arr, i, j - 1, a);
} else if (tmp < a) {
// 剔除最上面一行
solution(arr, i + 1, j, a);
} else {
isFind = true;
System.out.println("i:" + i + " j:" + j);
}
}
public static void main(String[] args) {
int i = 0;
int j = sortedMatrix[0].length - 1;
solution(sortedMatrix, i, j, 7);
System.out.println(isFind);
}
}
- 利用循环实现
class FindPartaillySortedMatrix2 {
// 测试数组
public static int[][] sortedMatrix = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 }, { 6, 8, 11, 15 } };
public static boolean solution(int[][] arr, int a) {
int i = 0;
int j = sortedMatrix[0].length - 1;
while (i <= sortedMatrix[0].length - 1 && j >= 0) {
// 取出右上角的元素
int tmp = arr[i][j];
if (tmp > a) {
--j;
} else if (tmp < a) {
++i;
} else {
System.out.println("i:" + i + " j:" + j);
return true;
}
}
return false;
}
public static void main(String[] args) {
System.out.println(solution(sortedMatrix, 7));
}
}