Posted onEdited onInLeetCodeDisqus: Symbols count in article: 839Reading time ≈1 mins.
O(n) time
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution { public: intmaxSubArrayLen(vector<int>& nums, int k){ unordered_map<int, int> m{{0, -1}}; // 注意要初始化0的下标为-1 int n = nums.size(); int res = 0; for (int i = 0, sum = 0; i < n; ++i) { sum += nums[i]; int t = sum - k; if (m.count(t)) { res = max(res, i - m[t]); } m[sum] = m.count(sum) ? m[sum] : i; } return res; } };
Posted onEdited onInLeetCodeDisqus: Symbols count in article: 2.8kReading time ≈3 mins.
sliding window O(n) time O(1) space 维护定长sliding window和一个cnt,cnt表示当前sliding window内符合要求的字符的个数,只有当cnt为m即sliding window的长度时,说明所有字符都是符合要求的,则找到了一个permutation
classSolution { public: boolcheckInclusion(string s1, string s2){ int m = size(s1), n = size(s2); if (m > n) returnfalse; int f[26] = {0}; for (char c : s1) { ++f[c - 'a']; } for (int cnt = 0, i = 0; i < n; ++i) { if (--f[s2[i] - 'a'] >= 0) { ++cnt; } if (i >= m && ++f[s2[i - m] - 'a'] > 0) { --cnt; } if (cnt == m) returntrue; } returnfalse; } };
stringnorm(conststring &w){ if (w.length() < 3) return w; stringres(1, w[0]); res += to_string(w.length() - 2); res += w.back(); return res; }
unordered_map<string, string> m; };
/** * Your ValidWordAbbr object will be instantiated and called as such: * ValidWordAbbr* obj = new ValidWordAbbr(dictionary); * bool param_1 = obj->isUnique(word); */
Posted onEdited onInLeetCodeDisqus: Symbols count in article: 790Reading time ≈1 mins.
基于dfs的类拓扑排序(不是真的拓扑排序) O(n) time O(n) space 后序遍历,当一个节点的所有子节点都被遍历过之后,将该节点加入,因为是倒序,所有最后要翻转过来,因为是类似拓扑排序,所以出度为0的末端点(最多一个)即便最先被访问也是第一个入栈,要排在最后 如果没有出度为0的点,前序遍历也是可以的,但是出度为0的点没有子节点所以必须最后访问,只有栈+后序遍历才能做到
classSolution { public: vector<int> spiralOrder(vector<vector<int>>& matrix){ if (matrix.empty() || matrix[0].empty()) return {}; int dr[] = {0, 1, 0, -1}, dc[] = {1, 0, -1, 0}, m = matrix.size(), n = matrix[0].size(), sz = m * n; vector<int> res; vector<vector<bool>> v(m, vector<bool>(n)); int r = 0, c = 0, i = 0; while (sz-- > 0) { res.push_back(matrix[r][c]); v[r][c] = true; r += dr[i]; c += dc[i]; if (r < 0 || r >= m || c < 0 || c >= n || v[r][c]) { r -= dr[i]; c -= dc[i]; i = (i + 1) % 4; r += dr[i]; c += dc[i]; } } return res; } };
classSolution { public: vector<int> spiralOrder(vector<vector<int>>& matrix){ if (matrix.empty() || matrix[0].empty()) return {}; enumD {N, E, W, S}; int dx[] = {0, 1, -1, 0}, dy[] = {-1, 0, 0, 1}; int n = matrix.size(), m = matrix[0].size(); int size = n * m; D d = E; vector<int> res; for (int i = 0, row = 0, col = 0, t = -1, b = n, l = -1, r = m; i < size; ++i) { // 用tblr来标记当前的上下左右的bound res.push_back(matrix[row][col]); switch (d) { case N: if (row + dy[d] == t) { d = E; ++l; } break; case E: if (col + dx[d] == r) { d = S; ++t; } break; case W: if (col + dx[d] == l) { d = N; --b; } break; case S: if (row + dy[d] == b) { d = W; --r; } break; default: break; } row += dy[d]; col += dx[d]; } return res; } };
Posted onEdited onInLeetCodeDisqus: Symbols count in article: 1.2kReading time ≈1 mins.
heap O((m+n)max(m, n)log(max(m, n))) time O(mn) space 从右上到左下r - c的差递增,从左上往右下扫描,根据差值存入对应的heap,再扫描一遍取出来即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { public: vector<vector<int>> diagonalSort(vector<vector<int>>& mat) { int m = mat.size(), n = mat[0].size(); unordered_map<int, priority_queue<int, vector<int>, greater<>>> hm; for (int r = 0; r < m; ++r) { for (int c = 0; c < n; ++c) { hm[r - c].push(mat[r][c]); } } for (int r = 0; r < m; ++r) { for (int c = 0; c < n; ++c) { mat[r][c] = hm[r - c].top(); hm[r - c].pop(); } } return mat; } };
O((m+n)max(m, n)log(max(m, n))) time O(max(m, n)) space 这个方法节省空间,但算边界比较麻烦,外层循环根据r - c的差值递增,内层循环根据r递增,d = r - c,因为0 <= c = r - d <= n - 1所以d <= r <= n - 1 + d并且0 <= r <= m - 1,所以max(d, 0) <= r <= min(m - 1, n - 1 + d)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution { public: vector<vector<int>> diagonalSort(vector<vector<int>>& mat) { int m = mat.size(), n = mat[0].size(); for (int d = 1 - n; d <= m - 1; ++d) { vector<int> v; for (int r = max(d, 0); r <= min(m - 1, n - 1 + d); ++r) { v.push_back(mat[r][r - d]); } sort(begin(v), end(v), greater()); for (int r = max(d, 0); r <= min(m - 1, n - 1 + d); ++r) { mat[r][r - d] = v.back(); v.pop_back(); } } return mat; } };