您的位置:首页 > 其它

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

2016-09-14 00:22 417 查看
【题意】给一个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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: