数据结构与算法-剑指Offer系列(3)二维数组中的查找-Java实现

42 篇文章 0 订阅
40 篇文章 0 订阅

题目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

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值