矩阵中的“二分查找”

本文介绍了如何解决LeetCode上的Search a 2D Matrix II问题。利用矩阵的有序特性,通过结合一维二分查找的思想,将问题分解为递归查找四个子矩阵,最终找到目标值。

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

leetcode题目:Search a 2D Matrix II 问题描述如下:

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
Integers in each row are sorted in ascending from left to right.
Integers in each column are sorted in ascending from top to bottom.

注意到该矩阵在在每个维度上是有序的,先考虑其中某一个维度(即一维)的情况,此时矩阵退化为列表,用二分查找即可解决。

类似地,在一个矩阵内,我们可以根据中点将矩阵分成2^2个子矩阵,每次比较可以剔除一个子矩阵,将剩下三个子矩阵进行递归

地查找。最后结果为三个子矩阵的并。 

// 假定数组规模为m*n,  m,n为常量
bool solve_matrix(int matrix[m][n], int target, int row_head,
		int  col_head, int row_end, int col_end){

	if(row_head > row_end || col_head > col_end) return false;

	int row_mid = (row_head + row_end) / 2;
	int col_mid = (col_head + col_end) / 2;
	
	if(matrix[row_mid][col_mid] == target) return true;
	else if( matrix[row_mid][col_mid] < target)
		return solve_matrix(matrix, target, row_head, col_mid+1, row_mid, col_end) ||
			solve_matrix(matrix, target, row_mid +1, col_head, row_end, col_mid) ||
			solve_matrix(matrix, target, row_mid+1, col_mid+1, row_end, col_end) ;
	else 	return solve_matrix(matrix, target, row_head, col_mid, row_mid-1, col_end) ||
			solve_matrix(matrix, target, row_mid , col_head, row_end, col_mid-1) ||
			solve_matrix(matrix, target, row_head, row_head, row_mid-1, col_mid-1) ;

}
特别要注意子矩阵的分法,否则可能造成段错误。第一次调用时row_end = m-1, col_end = n-1 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值