【LeetCode】240. Search a 2D Matrix II (Medium)

【题意】给一个m*n的矩阵,矩阵的每一行从左到右,从小到大排列,每一列从上到下,从小到大排列。给定一个元素,返回是不是在矩阵中。

【解】把矩阵分成四个部分

      1      2
      3      4
每个部分的最小元素在左上角,最大元素在右下角,如果要找的元素在最大和最小之间,接着分。

有限步后一定会终止,不可能有元素可能既出现在1也出现在4中,所以每次矩阵的size至少减少1/4。矩阵大小是O(mn),时间复杂度O(logm+logn)

class Solution {
public:
	bool searchMatrix(vector<vector<int>>& matrix, int target) {
		int m = matrix.size();
		int n = 0;
		if (m) n = matrix[0].size();
		return f(matrix, 0, m, 0, n, target);
	}
private:
	bool f(vector<vector<int>>& matrix, int t, int b, int l, int r, int target) {
		if (t >= b || l >= r) return false;
		if (b == t + 1 && r == l + 1)
			return matrix[t][l] == target;
		int m1 = (t + b) / 2;
		int m2 = (l + r) / 2;
		bool r1 = false, r2 = false, r3 = false, r4 = false;
		if (matrix[t][l] <= target && m1 - 1 >= t && m1 - 1 < b && m2  - 1 >= l && m2 - 1 < r && matrix[m1 - 1][m2 - 1] >= target)
			r1 = f(matrix, t, m1, l, m2, target);
		if (m2 >= l && m2 < r && matrix[t][m2] <= target && m1 - 1 >= t && m1 - 1 < b && matrix[m1 - 1][r - 1] >= target)
			r2 = f(matrix, t, m1, m2, r, target);
		if (m1 >= t && m1 < b && matrix[m1][l] <= target && m2 - 1 >= l && m2 - 1 < r && matrix[b - 1][m2 - 1] >= target)
			r3 = f(matrix, m1, b, l, m2, target);
		if (m1 < b && m1 >= t && m2 >= l && m2 < r && matrix[m1][m2] <= target && matrix[b - 1][r - 1] >= target)
			r4 = f(matrix, m1, b, m2, r, target);
		return r1 || r2 || r3 || r4;
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值