力扣2025.分割数组的最多方案数
-
哈希表 + 前缀和
- 用两个哈希表分别存元素(之后会遍历)左侧和右侧的前缀和
-
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; } };