74. 搜索二维矩阵

这篇博客讨论了一个在给定的特殊矩阵中查找目标值的算法问题。矩阵具有升序排列行和列的特性。提出了两种解决方案,一种是简单的遍历,另一种是采用二分搜索的方法,后者在数据规模较小的情况下仍能保持较高的效率。通过二分搜索实现的代码被详细展示,并附带了示例输入和输出,展示了在不同目标值情况下的判断结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

  • 每行中的整数从左到右按升序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

样例

示例1:
在这里插入图片描述输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例2:
在这里插入图片描述输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -1e4<= matrix[i][j], target <= 1e4

思路

这题直接依次遍历就行,数据强度很弱。
但写个二分还是可以块一点的,将所有元素下标从 0 到 总元素数-1 编号,进行二分搜索。 二分代码如下:

代码

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int len1 = matrix.length;
		int len2 = matrix[0].length;
		int total = len1*len2;
		int left = 0,right = total-1;
		while(left <= right) {
			int mid = (left+right)/2;
			int tmp = searchNumber(matrix, len1, len2, mid);
			if(target > tmp)
				left = mid + 1;
			else if(target < tmp)
				right = mid - 1;
			else
				return true;
		}
		return false;
    }

	int searchNumber(int[][] matrix,int len1,int len2,int pos) {
		int row = pos/len2;
		int col = pos%len2;
		return matrix[row][col];
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值