240. Search a 2D Matrix II

运用了递推的方法。

对于这样一个矩阵的任一子块,它的最小值总是在左上角,最大值总是在右下角,那么首先从对角线上的元素和target一个个比较,直到找到一个比target大的元素,以这个元素的左边和上边为界,将矩阵分成四个部分,则左上部分中的元素一定比target小,右下部分中的元素一定比target大,因此只需考虑左下和右上部分的元素。

将左下和右上部分重复上述步骤,最后就可以判断矩阵是否存在值为target的元素。


class Solution {
public:
	bool searchMatrix(vector<vector<int>>& matrix, int target) {
		bool res = false;
		int l1 = matrix.size();
		int l2 = matrix[0].size();
		recursion(matrix, 0, 0, l1 - 1, l2 - 1, res, target);
		return res;
	}
	void recursion(vector<vector<int>>& matrix, int rowS, int colS, int rowE, int colE, bool& res, int target) {
		if (rowS == rowE && colS == colE) {
			if (matrix[rowS][colS] == target) res = true;
		}
		else if (rowS <= rowE && colS <= colE){
			int row = rowS - 1, col = colS - 1;
			int l1 = rowE - rowS, l2 = colE - colS;
			int maxi = max(l1, l2);
			for (int i = 0; i <= maxi; i++) {
				if (i <= l1 && i <= l2) {
					row++; col++;
				}
				else if (i > l1 && i <= l2)
					col++;
				else row++;
				if (matrix[row][col] == target) {
					res = true;
					break;
				}
				else if (matrix[row][col] > target) {

					recursion(matrix, rowS, col, row - 1, colE, res, target);
					recursion(matrix, row, colS, rowE, col - 1, res, target);
					break;
				}
			}
		}
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值