滑动窗口
- 维持左右边界都不回退的一段范围,求解子数组、子串相关问题
- 求子数组以每个位置开头或者结尾情况下的答案
- 找范围和答案指标之间的单调性关系
| #include <vector> |
| #include <valarray> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| |
| int minSubArrayLen(int target, vector<int> &nums) { |
| int res = INT_MAX; |
| for (int l = 0, r = 0, sum = 0; r < nums.size(); r++) { |
| |
| sum += nums[r]; |
| |
| while (sum - nums[l] >= target) { |
| sum -= nums[l]; |
| l++; |
| } |
| |
| if (sum >= target) res = min(res, r - l + 1); |
| } |
| return res == INT_MAX ? 0 : res; |
| } |
| }; |
| #include <vector> |
| #include <string> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| int lengthOfLongestSubstring(string s) { |
| int len = s.length(); |
| int res = 0; |
| |
| vector<int> last(128, -1); |
| for (int l = 0, r = 0; r < len; r++) { |
| |
| l = max(l, last[s[r]] + 1); |
| |
| res = max(res, r - l + 1); |
| |
| last[s[r]] = r; |
| } |
| return res; |
| } |
| }; |
| #include <vector> |
| #include <string> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| int lengthOfLongestSubstring(string s) { |
| |
| vector<bool> entered(128, false); |
| int res = 0; |
| |
| for (int l = 0, r = 0; r < s.length(); r++) { |
| char ch = s[r]; |
| if (entered[ch]) { |
| |
| while (l < r && s[l] != ch) { |
| entered[s[l]] = false; |
| l++; |
| } |
| l++; |
| } else { |
| |
| entered[ch] = true; |
| res = max(res, r - l + 1); |
| } |
| } |
| return res; |
| } |
| }; |
| #include <vector> |
| #include <string> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| |
| string minWindow(string s, string t) { |
| int lenS = s.length(); |
| int lenT = t.length(); |
| if (lenS < lenT) return ""; |
| |
| |
| vector<int> map(256, 0); |
| for (char ch: t) map[ch]--; |
| |
| int len = INT_MAX; |
| |
| int start = 0; |
| |
| int count = lenT; |
| |
| for (int r = 0, l = 0; r < lenS; ++r) { |
| |
| if (map[s[r]] < 0) count--; |
| |
| map[s[r]]++; |
| |
| |
| if (count == 0) { |
| |
| |
| while (map[s[l]] > 0) { |
| map[s[l]]--; |
| l++; |
| } |
| if (r - l + 1 < len) { |
| |
| len = r - l + 1; |
| |
| start = l; |
| } |
| } |
| } |
| if (len == INT_MAX) return ""; |
| return s.substr(start, len); |
| } |
| }; |
| #include <vector> |
| #include <string> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| int canCompleteCircuit(vector<int> &gas, vector<int> &cost) { |
| int n = gas.size(); |
| |
| int prefixSum = 0; |
| |
| int len = 0; |
| |
| for (int l = 0, r; l < n; ++l) { |
| while (prefixSum >= 0) { |
| |
| if (len == gas.size()) return l; |
| |
| r = (l + len) % n; |
| |
| len++; |
| |
| prefixSum += gas[r] - cost[r]; |
| } |
| |
| len--; |
| |
| prefixSum -= gas[l] - cost[l]; |
| } |
| return -1; |
| } |
| }; |
| #include <vector> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| int canCompleteCircuit(vector<int> &gas, vector<int> &cost) { |
| int n = gas.size(); |
| |
| for (int l = 0, r = 0, gasLeft; l < n; l = r + 1, r = l) { |
| |
| gasLeft = 0; |
| |
| while (gasLeft + gas[r % n] - cost[r % n] >= 0) { |
| |
| if (r - l == n) return l; |
| |
| gasLeft += gas[r % n] - cost[r % n]; |
| r++; |
| } |
| } |
| return -1; |
| } |
| }; |
| #include <vector> |
| #include <string> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| |
| bool ok(vector<int> &counts, int len, int require) { |
| for (int i = 0; i < 4; ++i) { |
| |
| if (counts[i] > require) return false; |
| |
| len -= require - counts[i]; |
| } |
| |
| return len == 0; |
| } |
| |
| int balancedString(string s) { |
| int lenS = s.length(); |
| |
| int require = lenS / 4; |
| |
| vector<int> nums(lenS); |
| |
| vector<int> counts(4, 0); |
| for (int i = 0; i < lenS; ++i) { |
| nums[i] = s[i] == 'Q' ? 0 : (s[i] == 'W' ? 1 : (s[i] == 'E' ? 2 : 3)); |
| counts[nums[i]]++; |
| } |
| |
| |
| int res = lenS; |
| |
| for (int l = 0, r = 0; l < lenS; ++l) { |
| while (!ok(counts, r - l, require) && r < lenS) { |
| |
| counts[nums[r]]--; |
| r++; |
| } |
| if (ok(counts, r - l, require)) |
| res = min(res, r - l); |
| |
| counts[nums[l]]++; |
| } |
| return res; |
| } |
| }; |
| #include <vector> |
| #include <string> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| int balancedString(string s) { |
| int lenS = s.length(); |
| |
| int require = lenS / 4; |
| |
| vector<int> nums(lenS); |
| |
| vector<int> counts(4, 0); |
| for (int i = 0; i < lenS; ++i) { |
| nums[i] = s[i] == 'Q' ? 0 : (s[i] == 'W' ? 1 : (s[i] == 'E' ? 2 : 3)); |
| counts[nums[i]]++; |
| } |
| |
| int debt = 0; |
| for (int i = 0; i < 4; i++) { |
| if (counts[i] < require) { |
| |
| counts[i] = 0; |
| } else { |
| |
| counts[i] = require - counts[i]; |
| |
| debt -= counts[i]; |
| } |
| } |
| |
| if (debt == 0) return 0; |
| |
| int res = INT_MAX; |
| |
| for (int l = 0, r = 0; r < lenS; r++) { |
| if (counts[nums[r]]++ < 0) debt--; |
| if (debt == 0) { |
| while (counts[nums[l]] > 0) |
| counts[nums[l++]]--; |
| res = min(res, r - l + 1); |
| } |
| } |
| return res; |
| } |
| }; |
| #include <vector> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| vector<int> counts; |
| |
| |
| int numsOfMostKinds(vector<int> &nums, int k) { |
| counts.clear(); |
| counts.resize(20001, 0); |
| |
| int res = 0; |
| for (int l = 0, r = 0, types = 0; r < nums.size(); r++) { |
| |
| |
| if (counts[nums[r]] == 0) types++; |
| |
| counts[nums[r]]++; |
| |
| |
| while (types > k) { |
| |
| counts[nums[l]]--; |
| |
| if (counts[nums[l]] == 0) types--; |
| l++; |
| } |
| |
| res += r - l + 1; |
| } |
| return res; |
| } |
| |
| int subarraysWithKDistinct(vector<int> &nums, int k) { |
| return numsOfMostKinds(nums, k) - numsOfMostKinds(nums, k - 1); |
| } |
| }; |
| #include <vector> |
| #include <string> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| int longestSubstring(string s, int k) { |
| int len = s.length(); |
| vector<int> counts; |
| |
| int res = 0; |
| |
| for (int require = 1; require <= 26; ++require) { |
| counts.clear(); |
| counts.resize(256, 0); |
| |
| |
| int types = 0; |
| |
| int satisfy = 0; |
| |
| for (int l = 0, r = 0; r < len; r++) { |
| counts[s[r]]++; |
| |
| if (counts[s[r]] == 1) types++; |
| |
| if (counts[s[r]] == k) satisfy++; |
| |
| |
| while (types > require) { |
| if (counts[s[l]] == 1) types--; |
| if (counts[s[l]] == k) satisfy--; |
| |
| counts[s[l]]--; |
| l++; |
| } |
| |
| if (satisfy == require) res = max(res, r - l + 1); |
| } |
| } |
| return res; |
| } |
| }; |
本文作者:n1ce2cv
本文链接:https://www.cnblogs.com/sprinining/p/18450197
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步