力扣1590.使数组和能被P整除
-
同余
- 转化为求一段区间和余p为x
- i - j = x
- j = i - x
cpp
class Solution {
public:
int minSubarray(vector<int>& nums, int p) {
int x = accumulate(nums.begin(),nums.end(),0LL) % p;
if(x == 0) return 0;
int n = nums.size(),ans = n,s = 0;
unordered_map<int,int> last{{s,-1}};
for(int i=0;i<n;i++)
{
s = (s + nums[i]) % p;
last[s] = i;
auto it = last.find((s - x + p) % p);
if(it != last.end())
ans = min(ans,i - it->second);
}
return ans < n ? ans : -1;
}
};