力扣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;}};