如何判断一个数是否在二维数组中
题目:
给定一个二维数组和一个数,这个数组的每一行按照从左到右递增的顺序排列,每一列按照从上至下递增的顺序排列,判断这个数是否在这个二维数组中。
思路:
把这个二维数组看成一个矩阵,给定一个数9,判断9是否在这个二维数组中。
例如,给定一个二维数组如下:
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
3 | 5 | 6 | 7 | 8 |
4 | 5 | 7 | 9 | 10 |
5 | 6 | 8 | 10 | 11 |
7 | 8 | 9 | 12 | 13 |
我们每次取矩阵右上角的数字和待查找的数字进行比较。
-
第一次取5:
- 5<9,而和5在同一行的那些数字都比5小,因此我们要查找的数肯定不在5的左边,所以我们剔除掉这一行。矩阵变成下面这样:
- 8<9,同理,和8在同一行的数字都比8小,我们继续剔除这一行。矩阵变成下面这样:
- 10>9,而和10在同一列的数字都比10大,我们要查找的数字肯定不在这一列,因此剔除掉这一列。矩阵变成下面这样:
- 9=9,所以待查找数字在这个二维数组中。
3 | 5 | 6 | 7 | 8 |
---|---|---|---|---|
4 | 5 | 7 | 9 | 10 |
5 | 6 | 8 | 10 | 11 |
7 | 8 | 9 | 12 | 13 |
4 | 5 | 7 | 9 | 10 |
---|---|---|---|---|
5 | 6 | 8 | 10 | 11 |
7 | 8 | 9 | 12 | 13 |
4 | 5 | 7 | 9 |
---|---|---|---|
5 | 6 | 8 | 10 |
7 | 8 | 9 | 12 |
总结:
每次取矩阵右上角数字和带查找数字进行比较,如果这个数字等于待查找数字,查找结束;如果这个数字小于待查找数字,则剔除这一行;如果这个数字大于待查找数字,则剔除这一列。这样不断剔除一行或一列来缩小查找范围,直到找到指定数字返回true,或者查找完整个矩阵没有找到指定数字,返回false。
代码实现:
public static boolean find(int[][] a,int rows,int columns,int num) {
boolean flag = false;
int row = 0;
int column = columns - 1;
while(row<rows && column>=0) {
if(a[row][column] == num) {
flag = true;
break;
} else if(a[row][column] > num) {
--column; //剔除一列
} else {
++row; //剔除一行
}
}
return flag;
}