LeetCode 74. 搜索二维矩阵

文章介绍了如何在一个满足特定条件的整数矩阵中,利用分块查找和折半查找算法高效地确定目标值是否存在。首先通过第一列的递增特性找到目标可能所在的行,然后在该行内使用二分查找确定目标的具体位置。
摘要由CSDN通过智能技术生成

题目描述:

给你一个满足下述两条属性的 m x n 整数矩阵:

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

解题思路:

数组中,每一行按严格递增顺序排列,且每一行的第一个元素大于前一行的最后一个元素。这就说明,数组的第一列也是按递增顺序排列。因此可以采用分块查找的算法思想。首先确定target可能所在的行,再确定target是否存在。

第一步:确定target所在的行。针对数组第一列,根据折半查找的算法思想,查找到第一个大于target的元素,target所在的行就在它的前一行。

第二步:采用折半查找算法判定target是否存在。

代码实现:

	public boolean searchMatrix1(int[][] matrix, int target){
				
		//确定所在的行
		int row=matrix.length>1?binarySearchRow(matrix, target):0;
		//判断目标值是否存在
		if (row<0) {
            //当row小于0,说明target小于数组的第一个元素,那么数组中一定不存在target
			return false;
		}
		return binarySearch3(matrix[row], target);
	}
	
	
	//二分法(折半查找)判断target是否存在
	public  boolean binarySearch3(int[] nums,int target){
		int left=0,right=nums.length-1;
		
		while (left<=right) {
			int mid=(left+right)/2;
			if (nums[mid]<target) {
				left=mid+1;
			}else if (nums[mid]>target){
				right=mid-1;
			}else {
				return true;
			}
			
		}
		
		
		return false;
	}
	//查找target所在的行:
	public static int binarySearchRow(int[][] matrix,int target){
		int left=0,right=matrix.length-1;
		int mid=-1;
		while (left<=right) {
			mid=(left+right)/2;
			if (matrix[mid][0]<=target) {
				left=mid+1;
			}else {
				right=mid-1;
			}
			
		}		
		return right;
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值