力扣2025.分割数组的最多方案数
-
哈希表 + 前缀和
- 用两个哈希表分别存元素(之后会遍历)左侧和右侧的前缀和
cpp
typedef long long LL;
class Solution {
public:
int waysToPartition(vector<int>& nums, int k) {
int n = nums.size(),ans = 0;
vector<LL> sum(n);
unordered_map<LL,int> cnt,mp;
sum[0] = nums[0];
for(int i=1;i<n;i++)
{
sum[i] = sum[i-1] + nums[i];
//全存到右侧
cnt[sum[i-1]] ++;
}
LL tot = sum[n-1];
//不改的解
if(tot % 2 == 0) ans = cnt[tot/2];
for(int i=0;i<n;i++)
{
//每个元素都修改试试
int d = k - nums[i];
//改完发现满足
if((tot + d) % 2 == 0)
//左侧的满足的前缀和 + 右侧的满足的前缀和(左边的合法分割点+右边的)
ans = max(ans,mp[(tot + d) / 2] + cnt[(tot - d) / 2]);
//右边 ++,左边--
mp[sum[i]] ++;
cnt[sum[i]] --;
}
return ans;
}
};