题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:
1.暴力解法:因为每一行是从大到小,所以在遍历每一行时,可以使用折半查找。平均复杂度为O(nlogm)
2.简单解法:我们先分析题目,把二维数组在纸上画成一个矩形。列如:1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
然后从数组中选取一个数字7。
如果我们从左上角(也就是2)开始查找,一直到终点右下角(也就是15)。当选取的数字跟要查找的数字相等时,结束。当选取的数字小于要查找的数字时,要查找的数字应该在当前选取数字的右边或者下边。当选取的数字大于要查找的数字时,要查找的数字应该在当前选取数字的左边或者上边。这种情况有可能会出现重叠区域,游标到某处会往回走的现象,代码不太容易实现。
我们可以换种角度思考,减少查找的范围,我们每次都以右上角的数字作为标准进行比较,当查找的数字小于右上角的数字时,剔除该数字所在的这一列。当查找的数字大于右上角的数字时,剔除该数字所在的这一行。慢慢的减少查找的范围,最终找到该数字。平均复杂度为O(n+m)
代码实现如下:
public class subject_1 {
/***********************************************************************
* 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,
* 每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个
*整数, 判断数组中是否含有该整数。
***********************************************************************/
public static void main(String[] args) {
int[][] array ={{ 1, 2, 3, 4},
{ 2, 4, 6, 7},
{ 3, 5, 8, 9},
{ 4, 8, 9, 10},
{ 5, 9, 10,11}};
boolean find = Find(0, array);
System.out.println(find);
}
public static boolean Find(int target, int[][] array) {
int row = array.length; // 行长
int column = array[0].length;// 列长
boolean find = false;
int i = 0, j = column - 1;
while (i < row && j >= 0) {
int position = array[i][j];
if (target == position) {
find = true;
break;
} else if (target < position)
j--;
else {
i++;
}
}
return find;
}
}