借这个题记录一下类似题目的思路,之前总是做到但是总是忘记具体什么实现方法。
这种选子数组的题目其实很多都是相同的思路:用哈希表记录前k个位置的某些性质,然后再在第k+1位置的时候找前k位中符合要求的位置。
对于这个题来说,就是记录前k个位置的和对p的模,如果已经出现了相应的数值,就算与上一次出现位置的差,并更新答案和上次出现位置;如果没有出现过就添加到哈希表里。
class Solution {
public:
int minSubarray(vector<int>& nums, int p) {
int sz=nums.size();
unordered_map<int,int> pre,suf;
pre[0]=0;
int sum=0;
for(int i=0;i<sz;++i)
sum=(sum+nums[i])%p;
if(sum==0)
return 0;
int delta=sum;
sum=0;
int ans=INT_MAX;
for(int i=0;i<sz;++i)
{
sum=(sum+nums[i])%p;
int target=(sum-delta+p)%p;
if(pre.count(target))
ans=min(ans,i-pre[target]+1);
pre[sum]=i+1;
}
return ans==sz?-1:ans;
}
};