题目要求: 在一个二维数组中,每一行都是按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,请完成一个函数,输入这样的一个二维数组合一个整数,判断数组中是否含有该整数。
例如: 下面的实际的例子;
例如矩阵
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
求解问题的思路是这样的: 先找规律,当我们需要解决一个复杂的问题的时候,一个很有效的办法就行从一个具体的问题下手,通过分析简单具体的例子,试图寻找普遍的规律。
通过研究,我们发现下面的规律:首先选取数组中右上角的数字,如果该数字等于要查找的数字,则查找过程结束:如果该数字大于要查找的数字,则剔除这个数字所在的列;如果该数字小于要查找的数字,则剔除这个数字所在的行。也就是说,如果要查找的数字不在数组的右上角,则每一次都在数字的查找范围内剔除一行或者一列。逐步缩小查找范围,一直到找到查找的数字,或者查找范围为空。
代码实现如下:
import java.util.Scanner;
public class ArraryFind
{
/* 二维数组的查找:
* 题目要求是: 在一个二维数组中,在每一行都按照从左往右递增的排序,每一列都是按照从上到下递增的排序
*请完成一个函数,输入这样的一个二维数组合一个整数。请判断数组中是不是含有该整数。
*/
/*
* 2018.6.25
*/
public static void main(String[] args)
{
int[][] array={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
Find( array,7);
System.out.println("数组中包含0~24的所有整数");
System.out.println("请输入待查数字:");
Scanner input=new Scanner(System.in); // 用Scanner类来获取用户的输入;
int target=input.nextInt();
if(Find(array,target)==true)
System.out.println("该数组中包含整数:"+target);
else
System.out.println("该数组中不包含整数:"+target);
}
public static boolean Find(int[][] array,int target)
{
if(array==null)
return false;
int rowCount=array.length;
int colCount=array[0].length;
// 从右上开始
int row=0;
int col=array[0].length-1;
while(row<rowCount && col>=0)
{
int val=array[row][col];
if(val<target)
{
row++;
}
else if(val>target)
{
col--;
}
else if(val==target)
return true;
}
return false;
}
}
参考资料:剑指offer 何海涛著 电子工业出版社