classSolution { public: intmaximalRectangle(vector<vector<char>>& matrix){ if (matrix.empty() || matrix[0].empty()) return0; int n = matrix.size(); int m = matrix[0].size(); vector<int> height(m + 1); // 这里一定要多一个!!方便后边算最大面积 int res = 0; for (int row = 0; row < n; ++row) { for (int col = 0; col < m; ++col) { height[col] = matrix[row][col] == '0' ? 0 : height[col] + 1; } res = max(res, helper(height)); } return res; }
inthelper(constvector<int> &height){ int n = height.size(); stack<int> s{{-1}}; int res = 0; for (int i = 0; i < n; ++i) { while (s.top() != -1 && height[i] < height[s.top()]) { int h = height[s.top()]; s.pop(); res = max(res, h * (i - s.top() - 1)); } s.push(i); } return res; } };
classSolution { public: intcalculate(string s){ int i = 0; s += "+"; return calc(s, i); }
intcalc(conststring &s, int &i){ char op = '+'; long n = s.size(), num = 0, res = 0; for (; i < n; ++i) { char c = s[i]; if (isdigit(c)) { num = num * 10 + c - '0'; } elseif (c == '(') { num = calc(s, ++i); } elseif (c != ' ') { res += (44 - op) * num; // 因为没有*/所以不需要curRes来进行局部运算,直接用res累加即可 op = c; num = 0; if (c == ')') break; } } return res; } };
classSolution { public: intcalculate(string s){ int i = 0; s += "+"; return calc(s, i); }
intcalc(conststring &s, int &i){ char op = '+'; long n = s.size(), num = 0, res = 0; for (; i < n && op != ')'; ++i) { char c = s[i]; if (isdigit(c)) { num = num * 10 + c - '0'; } elseif (c == '(') { num = calc(s, ++i); --i; // 因为最后循环终止条件是op != ')'所以当op为')'时i已经指向下一个符号,所以需要回退一个 } elseif (c != ' ') { res += (44 - op) * num; // 因为没有*/所以不需要curRes来进行局部运算,直接用res累加即可 op = c; num = 0; } } return res; } };
Posted onEdited onInLeetCodeDisqus: Symbols count in article: 911Reading time ≈1 mins.
O(n+limit) time O(limit) space 这道题首先要仔细观察limit的取值范围,发现跟n是一样的,说明limit可能会影响复杂度,同时还要注意nums每个数都不超过limit,所以可以先从暴力解下手,对于每一个pair,sum变成[2, limit*2]之间任何一个数的最小步数是定值:
classSolution { public: intminMoves(vector<int>& nums, int limit){ vector<int> f(limit * 2 + 2); int n = size(nums); for (int i = 0; i * 2 < n; ++i) { int a = nums[i], b = nums[n - 1 - i]; f[2] += 2; --f[min(a, b) + 1]; --f[a + b]; ++f[a + b + 1]; ++f[max(a, b) + limit + 1]; } int res = n, cnt = 0; for (int i = 2; i <= limit * 2; ++i) { res = min(res, cnt += f[i]); } return res; } };
classNumMatrix { public: NumMatrix(vector<vector<int>> matrix) { if (matrix.empty() || matrix[0].empty()) return; int n = matrix.size(), m = matrix[0].size(); mtx.resize(n + 1, vector<int>(m + 1)); for (int r = 1; r <= n; ++r) { for (int c = 1; c <= m; ++c) { mtx[r][c] = matrix[r - 1][c - 1] + mtx[r - 1][c] + mtx[r][c - 1] - mtx[r - 1][c - 1]; } } }
intsumRegion(int row1, int col1, int row2, int col2){ return mtx[row2 + 1][col2 + 1] - mtx[row1][col2 + 1] - mtx[row2 + 1][col1] + mtx[row1][col1]; }
vector<vector<int>> mtx; };
/** * Your NumMatrix object will be instantiated and called as such: * NumMatrix obj = new NumMatrix(matrix); * int param_1 = obj.sumRegion(row1,col1,row2,col2); */
voiddfs(string &s, int l, int r){ if (l > r) { res.push_back(s); return; } int k = 0; if (l == r) { k = 1; } elseif (l > 0) { k = 2; } for (int n = size(v[k]), i = 0, j = n - 1; i < j; ++i, --j) { s[l] = v[k][i]; s[r] = v[k][j]; dfs(s, l + 1, r - 1); } }