题目链接:
描述:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:
先说我的思路,采取一种递归一个一个查找的方式,
1,2,8,9,
2,4,9,12
4,7,10,13
6,8,11,15
比如查找8。
1、先按照1,2,8的顺序,找到8,
2、8大于7。则跳到第二行的4
2、4小于8,则向右遍历,找到9
3、9大于8,则跳到第三行的7
4、7小于8,向右遍历,找到10
5、10大于8,则向下跳到第四行的8
6、找到8,返回。
该方式就是简单的根据边界值查找,但是递归层级较多,感觉不是一个好的方法,但是能解决问题。
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
int[][] array = new int[][]{{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
int target = 15;
boolean find = solution.Find(target, array);
System.out.println(find);
}
public boolean Find(int target, int[][] array) {
return ffind(0, 0, 0, target, array);
}
/**
* @param x
* @param y
* @param direction 正向遍历
* @param target
* @param array
* @return
*/
public boolean ffind(int x, int y, int direction, int target, int[][] array) {
int ylength = array.length;
int xlength = array[0].length;
if (x >= xlength || x < 0) {
return false;
}
if (y >= ylength || y < 0) {
return false;
}
int value = array[y][x];
String str = "←";
if (direction == 0) {
str = "→";
} else if (direction == 1) {
str = "↓";
}
System.out.println("x:" + x + ",y:" + y + ",value:" + value + ",direction:" + str);
if (value == target) {
return true;
}
//0→ 1↓ 2←
if (direction == 0) {
if (target > value) {
if (x == (xlength - 1)) {
return ffind(x, y + 1, 1, target, array);
}
return ffind(x + 1, y, 0, target, array);
} else {
return ffind(x - 1, y + 1, 1, target, array);
}
} else if (direction == 1) {
if (target > value) {
if ((x + 1) == xlength) {
return ffind(x, y + 1, 1, target, array);
}
return ffind(x + 1, y, 0, target, array);
} else {
if (x == 0) {
return ffind(x, y + 1, 0, target, array);
}
return ffind(x - 1, y, 2, target, array);
}
} else {
if (target > value) {
return ffind(x, y + 1, 1, target, array);
} else {
return ffind(x - 1, y, 2, target, array);
}
}
}
}