题目3:二维数组中的查找
题目描述:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:
- 首先选取数组中右上角的数字,如果该数字等于要查找的数组, 则查找过程结束;
- 如果该数字大于要查找的数字,则删除这个数字所在的列;
- 如果该数字小于要查找的数字,则剔除这个数字所在的行。
- 如果要查找的数组不在数组的右上角,则每一次都在数组的查找范围中剔除一行或者一列,这样每一步都可以缩小范围,直到找到要查找的数字,或者查找范围为空;
代码实现:
package swordToOffer;
public class Num3_FindInMatrix {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] matrix1 = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 }, { 6, 8, 11, 15 } };
int[][] matrix2 = null;
int[][] matrix3 = { { 1, 2, 8, 9 }, { 5, 4, 9, 12 }, { 4, 7, 10, 13 }, { 6, 8, 11, 15 } };
int[][] matrix4 = { { 1, 2, 8, 9 }, { 4, 9, 12 }, { 4, 7, 10, 13 }, { 6, 8, 11, 15 } };
int[] result = find(matrix1,13);
System.out.println("数字坐标为 "+result[0]+" - "+result[1]);
result = find(matrix2,3);
System.out.println("数字坐标为 "+result[0]+" - "+result[1]);
result = find(matrix3,5);
System.out.println("数字坐标为 "+result[0]+" - "+result[1]);
result = find(matrix4,8);
System.out.println("数字坐标为 "+result[0]+" - "+result[1]);
}
//返回target的坐标位置
public static int[] find(int[][] matrix ,int target) {
int[] pos = {-1,-1}; //表示不存在
//异常处理 判断数组是否存在
if(matrix==null||matrix.length<=0) {
System.out.println("非法数组");
return pos;
}
int rows = 0; //行数
int columns = matrix[0].length; //列数
for(int i=0;i<matrix.length;i++) {
if(matrix[i].length!=columns) {
System.out.println("数组列数不一致!");
return pos;
}
for(int j=0;j<matrix[i].length;j++) {
if(i==0&&j==0) {
//起始位置不比较
break;
}
if(i==0) {//第一行,和前一列作比较
if(matrix[i][j]<matrix[i][j-1]) {
//不满足向右递增的顺序
System.out.println("数组左右排序出错 "+matrix[i][j]+" < "+matrix[i][j-1]);
return pos;
}
}else if(j==0) {//第一列的数,仅和前一行的数比较
if(matrix[i][j]<matrix[i-1][j]) {
//不满足向下增加的顺序
System.out.println("数组上下排序出错 "+matrix[i][j]+" < "+matrix[i-1][j]);
return pos;
}
}else if(matrix[i][j]<matrix[i-1][j]||matrix[i][j]<matrix[i][j-1]) {
//其余位置需要和前一行或前一列作比较 不满足规律将推出
System.out.println("数组左右排序出错 "+matrix[i][j]+" < "+matrix[i][j-1]);
System.out.println("数组上下排序出错 "+matrix[i][j]+" < "+matrix[i-1][j]);
return pos;
}
}
}
//正式查找
int row=0; //行数
int column = matrix[0].length-1; //列数
while(row<matrix.length-1&&column>=0) {
if(target == matrix[row][column]) {
pos[0] = row;
pos[1] = column;
System.out.println(target+"出现在数组 的坐标: "+pos[0]+" "+pos[1]);
return pos;
}else if(target<matrix[row][column]) {
column--;
}else {
row++;
}
}
System.out.println("未找到相关数字:"+target);
return pos;
}
}
输出结果:
13出现在数组 的坐标: 2 3
数字坐标为 2 - 3
非法数组
数字坐标为 -1 - -1
数组左右排序出错 4 < 5
数组上下排序出错 4 < 2
数字坐标为 -1 - -1
数组列数不一致!
数字坐标为 -1 - -1