LC1590. 使数组和能被 P 整除

在这里插入图片描述

借这个题记录一下类似题目的思路,之前总是做到但是总是忘记具体什么实现方法。

这种选子数组的题目其实很多都是相同的思路:用哈希表记录前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;
    }
};

猜你喜欢

转载自blog.csdn.net/m0_49792815/article/details/129470470