题目:(剑指offer, page38)
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,完成一个函数,输入一个这样的二维数组和一个整数,判断该数组中是否有该整数。
书中提供一种算法:
思路:
从数组的右上角元素开始比较,如果该元素等于要查找的元素,OK。
如果该元素大于要查找的元素,那么该元素所在的列中的所有元素一定都大于所要搜索的元素,剔除该元素所在的列。
如果该元素小于要查找的元素,那么该元素所在的行中的所有元素一定都小于所要搜索的元素,剔除该元素所在的行。
这样逐步缩小搜索范围,直到找到所要的元素,或者搜索范围为空。
Java 代码:
/**
* <p>
* 题目:(剑指offer, page38)
* <p>
* 在一个二维数组中,每一行都按照从左到右递增的顺序排序,
* <p>
* 每一列都按照从上到下递增的顺序排序,
* <p>
* 完成一个函数,输入一个这样的二维数组和一个整数,判断该数组中是否有该整数。
*
* @author likebamboo
*/
public class ArraySearch {
/**
* 剑指offer上给出的算法
*
* @param data 数据源
* @param key 需要查找的值
* @return
*/
private static boolean find1(int[][] data, int key) {
if (data == null || data.length == 0 || data[0].length == 0) {
return false;
}
// 所选择的元素的下标
int row = 0, col = data[0].length - 1;
while (row < data.length && col >= 0) {
if (data[row][col] == key) {
return true;
}
// 如果当前元素大于要查找的值,删除该元素所在的列
if (data[row][col] > key) {
col--;
} else {// 如果当前元素小于要查找的值,删除该元素所在的行
row++;
}
}
return false;
}
public static void main(String[] args) {
int[][] data = new int[][] {
{
1, 2, 4, 6, 10
}, {
2, 6, 8, 9, 11
}, {
4, 7, 10, 13, 14
}, {
6, 8, 11, 18, 20
}, {
8, 10, 13, 20, 25
}, {
12, 13, 17, 25, 30
}, {
19, 22, 25, 30, 33
}, {
20, 25, 27, 40, 41
}, {
25, 30, 35, 44, 46
}, {
26, 48, 45, 50, 60
}
};
int key = 41;
System.out.println(find1(data, key));
}
}