lc3026
hash+动态记录前缀和
class Solution {
public:
long long maximumSubarraySum(vector<int> &nums, int k) {
long long ans = LLONG_MIN, sum = 0;
unordered_map<int, long long> min_s;
for (int x: nums) {
auto it = min_s.find(x + k);
if (it != min_s.end()) {
ans = max(ans, sum + x - it->second);
}
it = min_s.find(x - k);
if (it != min_s.end()) {
ans = max(ans, sum + x - it->second);
}
it = min_s.find(x);
if (it == min_s.end() || sum < it->second) {
min_s[x] = sum;
}
sum += x;
}
return ans == LLONG_MIN ? 0 : ans;
}
};
lc2588

class Solution {
public:
long long beautifulSubarrays(vector<int>& nums)
{
int k=0;
int n=nums.size();
vector<int> dp(n+1);
unordered_map<int,int> hash;
hash[0]=1;//dp[i]==k
long long ret=0;
for(int i=1;i<=n;i++)
{
dp[i]=dp[i-1]^nums[i-1];
if(hash[dp[i]])
ret+=hash[dp[i]];
hash[dp[i]]++;
}
return ret;
}
};
lc560
前缀和+hash
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
//子数组:连续的
int n=nums.size();
vector<int> dp(n+1);
unordered_map<int,int> count;
count[0]=1;//dp[i]==k
int ret=0;
for(int i=1;i<=n;i++)
{
dp[i]=dp[i-1]+nums[i-1];
if(count[dp[i]-k])
ret+=count[dp[i]-k];
count[dp[i]]++;
}
return ret;
}
};
lc3003 前后缀分解
解决"执行操作后的最大分割数"问题
处理字符串前缀、统计字符,结合修改一处字符的最优情况
计算出最大分割数量



class Solution {
public:
int maxPartitionsAfterOperations(string s, int k) {
if (k == 26) {
return 1;
}
int seg = 1, mask = 0, size = 0;
auto update = [&](int i) -> void {
int bit = 1 << (s[i] - 'a');
if (mask & bit) { // s[i] 已经在当前这一段中,无影响
return;
}
if (++size > k) {
seg++; // s[i] 在新的一段中
mask = bit;
size = 1;
} else {
mask |= bit;
}
};
int n = s.length();
vector<pair<int, int>> suf(n + 1);
for (int i = n - 1; i >= 0; i--) {
update(i);
suf[i] = {seg, mask};
}
int ans = seg; // 不修改任何字母
seg = 1; mask = 0; size = 0;
for (int i = 0; i < n; i++) {
auto [suf_seg, suf_mask] = suf[i + 1];
int res = seg + suf_seg; // 情况 3
int union_size = popcount((uint32_t) mask | suf_mask);
if (union_size < k) {
res--; // 情况 1
} else if (union_size < 26 && size == k && popcount((uint32_t) suf_mask) == k) {
res++; // 情况 2
}
ans = max(ans, res);
update(i);
}
return ans;
}
};