class Solution {
public:
int minSubarray(vector<int>& a, int p) {
int n = a.size();
vector<int> s(n + 1);
for(int i = 1; i <= n; i++) {
s[i] = (s[i - 1] + a[i - 1]) % p;
} // mod p 前缀和
map<int, int> st; // 余数 -> 上一次出现的位置
if(s[n] == 0) return 0; // 特例判定
st[0] = 0;
int ans = n + 1;
for(int i = 1; i <= n; i++) {
int prv = (s[i] - s[n] + p) % p;
cout << "prv: " << prv << endl;
if(st.count(prv)) {
ans = min(ans, i - st[prv]); // 有点 dp 的意思
cout << "ans: " << ans << endl;
}
st[s[i]] = i;
}
if(ans >= n) ans = -1;
return ans;
}
};
使数组和能被 P 整除
最新推荐文章于 2023-03-10 16:19:35 发布