构建前缀信息解决子数组问题
| #include <vector> |
| |
| using namespace std; |
| |
| class NumArray { |
| public: |
| |
| vector<int> prefixSum; |
| |
| NumArray(vector<int> &nums) { |
| prefixSum.resize(nums.size() + 1); |
| prefixSum[0] = 0; |
| for (int i = 0; i < nums.size(); ++i) |
| prefixSum[i + 1] = prefixSum[i] + nums[i]; |
| } |
| |
| int sumRange(int left, int right) { |
| return prefixSum[right + 1] - prefixSum[left]; |
| } |
| }; |
| #include <vector> |
| #include <iostream> |
| #include <unordered_map> |
| |
| using namespace std; |
| |
| int main() { |
| int n, k; |
| cin >> n >> k; |
| vector<int> nums(n); |
| for (int i = 0; i < n; ++i) |
| cin >> nums[i]; |
| |
| |
| unordered_map<int, int> map; |
| |
| map.emplace(0, -1); |
| int prefixSum = 0; |
| int res = 0; |
| |
| for (int i = 0; i < n; ++i) { |
| prefixSum += nums[i]; |
| |
| if (map.find(prefixSum) == map.end()) |
| map[prefixSum] = i; |
| |
| if (map.find(prefixSum - k) != map.end()) |
| res = max(res, i - map[prefixSum - k]); |
| } |
| cout << res; |
| } |
| #include <vector> |
| #include <iostream> |
| #include <unordered_map> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| int subarraySum(vector<int> &nums, int k) { |
| |
| unordered_map<int, int> map; |
| map.emplace(0, 1); |
| int res = 0; |
| int prefixSum = 0; |
| for (int i = 0; i < nums.size(); ++i) { |
| prefixSum += nums[i]; |
| |
| if (map.find(prefixSum - k) != map.end()) |
| res += map[prefixSum - k]; |
| map[prefixSum]++; |
| } |
| return res; |
| } |
| }; |
| #include <vector> |
| #include <iostream> |
| #include <unordered_map> |
| |
| using namespace std; |
| |
| int main() { |
| int n; |
| cin >> n; |
| vector<int> nums(n); |
| for (int i = 0; i < n; ++i) |
| cin >> nums[i]; |
| |
| |
| unordered_map<int, int> map; |
| map.emplace(0, -1); |
| |
| int prefix = 0; |
| int res = 0; |
| for (int i = 0; i < n; ++i) { |
| if (nums[i] > 0) prefix++; |
| if (nums[i] < 0) prefix--; |
| |
| if (map.find(prefix) != map.end()) |
| res = max(res, i - map[prefix]); |
| |
| if (map.find(prefix) == map.end()) |
| map.emplace(prefix, i); |
| } |
| cout << res; |
| } |
| #include <vector> |
| #include <iostream> |
| #include <unordered_map> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| int longestWPI(vector<int> &hours) { |
| |
| unordered_map<int, int> map; |
| map.emplace(0, -1); |
| |
| int prefix = 0; |
| int res = 0; |
| |
| for (int i = 0; i < hours.size(); i++) { |
| prefix += hours[i] > 8 ? 1 : -1; |
| if (prefix > 0) { |
| |
| res = i + 1; |
| } else { |
| |
| |
| if (map.find(prefix - 1) != map.end()) |
| res = max(res, i - map[prefix - 1]); |
| } |
| |
| if (map.find(prefix) == map.end()) |
| map.emplace(prefix, i); |
| } |
| return res; |
| } |
| }; |
| #include <vector> |
| #include <iostream> |
| #include <unordered_map> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| int minSubarray(vector<int> &nums, int p) { |
| |
| int remove = 0; |
| for (int num: nums) remove = (remove + num) % p; |
| |
| if (remove == 0) return 0; |
| |
| int res = INT_MAX; |
| |
| int prefixSum = 0; |
| |
| unordered_map<int, int> map; |
| map.emplace(0, -1); |
| for (int i = 0; i < nums.size(); i++) { |
| prefixSum = (prefixSum + nums[i]) % p; |
| |
| |
| |
| int find = (prefixSum - remove + p) % p; |
| if (map.find(find) != map.end()) |
| res = min(res, i - map[find]); |
| |
| map[prefixSum] = i; |
| } |
| |
| return (res == INT_MAX || res == nums.size()) ? -1 : res; |
| } |
| }; |
| #include <vector> |
| #include <iostream> |
| |
| using namespace std; |
| |
| class Solution { |
| public: |
| int findTheLongestSubstring(string s) { |
| int ans = 0; |
| int len = s.length(); |
| |
| vector<int> map(32, -2); |
| |
| map[0] = -1; |
| |
| int status = 0; |
| |
| for (int i = 0, m; i < len; i++) { |
| |
| m = move(s[i]); |
| |
| |
| if (m != -1) status ^= 1 << m; |
| if (map[status] != -2) { |
| |
| ans = max(ans, i - map[status]); |
| } else { |
| |
| map[status] = i; |
| } |
| } |
| return ans; |
| } |
| |
| int move(char ch) { |
| switch (ch) { |
| case 'a': |
| return 0; |
| case 'e': |
| return 1; |
| case 'i': |
| return 2; |
| case 'o': |
| return 3; |
| case 'u': |
| return 4; |
| default: |
| |
| return -1; |
| } |
| } |
| }; |
本文作者:n1ce2cv
本文链接:https://www.cnblogs.com/sprinining/p/18442490
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步