题目:在一个二维数组中,每一行按照从左到右递增的顺序排列,每一列按照从上到下递增的顺序排列,输入一个二维数组和整数,判断数组中是否含有该整数
思路:
- 如果按常规想法,可以把二维数组画成矩形,然后从数组中选取一个数字,如果这个数字与要查找的数字相等,结束查找过程。如果选取的数字小于要查找的数字,那么要查找的数字就在这个数字的右边或者下边。同样地,如果要查找的数字大于这个数字,那么应该选取当前数字右边或者上边的数字。这样的话就会有两个区域出现,并且有很大的重复区域,问题变得复杂化。
- 首先选取数组右上角的数字与要查找的数字进行比较,如果该数字等于要查找的数字,查找结束。如果这个数字小于要查找的数字,则剔除当前行,并向下一行查找。如果这个数字大于要查找的数字,那么剔除当前列,向上一列查找。不停重复即可。
代码:
/**
* 在一个二维数组中,每一行按照从左到右递增的顺序排列,每一列按照从上到下递增的顺序排列,输入一个二维数组和整数,判断数组中是否含有该整数
*
* @author VicterTian
* @version V1.0
* @Date 2019/1/19
*/
public class P44_FindInPartiallySortedMatrix {
public static void main(String[] args) {
int[][] array =
{
{1, 2, 8, 9, 10},
{2, 4, 9, 12, 16},
{4, 7, 10, 13, 17},
{6, 8, 11, 15, 18}
};
System.out.println(findInPartiallySortedMatrix(array, 18));
System.out.println(findInPartiallySortedMatrix(array, 5));
}
private static boolean findInPartiallySortedMatrix(int[][] array, int num) {
if (array == null || array.length == 0 || array[0].length == 0) {
return false;
}
// 计算总行数(从0开始)
int rows = array.length - 1;
// 计算总列数(从0开始)
int columns = array[0].length - 1;
// 设置初始行
int row = 0;
// 设置初始列
int column = columns;
while (row <= rows && column >= 0) {
if (array[row][column] == num) {
return true;
} else if (array[row][column] > num) {
--column;
} else if (array[row][column] < num) {
++row;
}
}
return false;
}
}