前后缀分解

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_sx = 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;

hash0=1;//dpi==k

long long ret=0;

for(int i=1;i<=n;i++)

{

dpi=dpi-1^numsi-1;

if(hashdp\[i])

ret+=hashdp\[i];

hashdp\[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;

count0=1;//dpi==k

int ret=0;

for(int i=1;i<=n;i++)

{

dpi=dpi-1+numsi-1;

if(countdp\[i-k])

ret+=countdp\[i-k];

countdp\[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 << (si - 'a');

if (mask & bit) { // si 已经在当前这一段中,无影响

return;

}

if (++size > k) {

seg++; // si 在新的一段中

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);

sufi = {seg, mask};

}

int ans = seg; // 不修改任何字母

seg = 1; mask = 0; size = 0;

for (int i = 0; i < n; i++) {

auto suf_seg, suf_mask = sufi + 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;

}

};

相关推荐
知无不研35 分钟前
c语言中循环的介绍与简单应用
c语言·开发语言·算法·循环·for·while
a187927218312 小时前
【算法】动态规划第四篇:背包收官——min 哨兵、计数世界与组合排列分水岭
算法·leetcode·动态规划·dp·01背包·算法讲解·决策合并
2601_962297482 小时前
在python3中、下列输出变量a的正确写法是_2020超星大数据Python免费答案
数据结构·python·算法·编程·字符串操作
辰烨chenye2 小时前
LeetCode Hot 100 题解 · 子串篇
算法·leetcode·职场和发展
辰烨chenye2 小时前
LeetCode Hot 100 题解 · 堆篇
java·算法·leetcode
手写码匠2 小时前
华为云Flexus+DeepSeek征文|DeepSeek 应用监控告警体系实战:从“用户投诉才知道“到“故障前就发现“
人工智能·深度学习·算法·aigc
shehuiyuelaiyuehao3 小时前
算法29,前缀和,除自身以外的数组的乘积
java·数据结构·算法
智购科技自动售货机厂家3 小时前
2026自动售货机设备清洁效果自动验证:从图像比对到评分算法的工程实践~YH
人工智能·算法·计算机视觉
姜穆澜4 小时前
机器学习实战指南:从算法原理到工程落地
人工智能·算法·机器学习