题目:在一个m行n列的二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列。现输入这样的一个二维数组和一个整数,请完成一个函数,判断数组中是否含有该整数。
输入:7 [[1,2,7,9][2,6,8,10][10,15,16,17]]
输出:true
思路:定位到数组的左下角,之后用定位到的数据与目标数据对比,如果 定位数据 > 目标数据 则定位坐标x坐标减1,如果定位数据 < 目标数据 则定位坐标y坐标加1,如果中间找到目标数据则返回true,如果一直找不到目标数据则返回false。

代码实现:
public class Solution {
/**
* @param args
*/
public static void main(String[] args) {
Solution solution = new Solution();
int target = 7;
int[][] array = new int[][]{{1, 2, 7, 9}, {2, 6, 8, 10}, {10, 15, 16, 17}};
System.out.println(solution.Find(target, array));
}
public boolean Find(int target, int[][] array){
if (array == null || array.length == 0 || array[0].length == 0) {
return false;
}
return Find(target, array, array.length -1, 0);
}
public boolean Find(int target, int[][] array, int x, int y){
if (array[x][y] == target) {
return true;
}else if (array[x][y] > target) {
if (x - 1 < 0) {
return false;
}
return Find(target, array, x - 1, y);
}else {
if (y + 1 > array[0].length - 1) {
return false;
}
return Find(target, array, x, y + 1);
}
}
}
ps.实际上还有一种分治发可以解决这个问题,该方法是从(0,0)坐标开始沿着对角线找到第一个大于目标数据的数,这时可以以该坐标和上一个经过的这边间作为间隔,将数组划分成4部分,其中左上角的数据肯定小于目标数据可以排除,右下角的数据肯定大于目标数据也可以排除,之后将右上角和左下角的两个矩阵作为新的矩阵进行进行相同的动作。

由于该方法实现起来会出现很多比较琐碎的细节需要处理,这里我并没有完全实现(一开始是用这种方法的,调了一会发现太繁琐了,所以最后使用的第一种方法来实现)。
在按行递增、列递增的二维数组中查找目标整数,从右下角开始,通过比较定位数据与目标数据大小进行移动,直至找到或遍历完所有可能位置。若找到则返回true,否则返回false。
854

被折叠的 条评论
为什么被折叠?



