5874. 分割数组的最多方案数

本文介绍了一种利用前缀和与哈希表解决数组分割成连续子数组,使得子数组和为目标值的问题。通过维护两个哈希表分别记录修改元素前后的前缀和出现次数,可以高效地计算出满足条件的分割方案数。代码中展示了C++实现,注意结果可能超过int范围,需使用long long类型。虽然作者在62场双周赛中遗憾未获满分,但通过不断努力,有望在下次比赛中取得更好的成绩。
摘要由CSDN通过智能技术生成

思路

分割数组的最多方案数

  • 考查点:前缀和+哈希表
  • 看到有连续的子数组和,很明显在提示用前缀和,分析出要尽快获取前后缀匹配的数量,可以用哈希表。比较难处理的就是题目可以改变数组中某个数组,此时只影响前缀和后面的结果,因此我们可以将要查的值分为两段。
    • 当前修改元素之前的数
    • 当前修改元素之后的数
  • 更新数组后,目标值也改变了,我们可以考虑在修改元素之前求目标值,更新元素之后求修改后的目标值,两者之和即是结果。
  • 注意点:
    • 结果可能会超过int,记得使用long long
  • 62场双周赛,这是我最接近AK的一次,可惜了,还要继续加油鸭!

代码

class Solution {
public:
    using LL = long long;
    int waysToPartition(vector<int>& nums, int k) {
        // 前后缀和
        int n = nums.size();
        vector<LL> sum(n+1);
        unordered_map<LL, int> oldR, newL;
        
        for(int i = 1; i <= n; i++){
            sum[i] = sum[i-1] + nums[i-1];
            if(i > 1) oldR[sum[i-1]]++;
        }
        LL tot = sum[n];
        int res = 0;
        // 不改变
        if(tot % 2 == 0){
            res = oldR[tot/2];
        }
        // cout<<res<<endl;
        // 改变一个位置
        for(int i = 1; i <= n; i++){
            int d = k - nums[i-1];
            if((tot + d) % 2 == 0){
                res = max(res, newL[(tot+d)/2] + oldR[(tot-d)/2]);
            }
            newL[sum[i]]++;
            oldR[sum[i]]--;
        }
        
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值