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

来源:互联网 发布:清华大学王斌算法考试 编辑:程序博客网 时间:2024/06/04 19:35

【题意】给一个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;}};


0 0
原创粉丝点击