1.前缀和
class Solution {
public:
int pivotIndex(vector<int>& nums) {
int total = accumulate(nums.begin(), nums.end(), 0);
int sum = 0;
for (int i = 0; i < nums.size(); ++i) {
if (2 * sum + nums[i] == total) {
return i;
}
sum += nums[i];
}
return -1;
}
};
class Solution {
public:
int subarraysDivByK(vector<int>& nums, int k) {
unordered_map<int, int> record = {{0, 1}};
int sum = 0, ans = 0;
for (int elem: nums) {
sum += elem;
// 注意 C++ 取模的特殊性,当被除数为负数时取模结果为负数,需要纠正
int mod = (sum % k + k) % k;
if (record.count(mod)) {
ans += record[mod];
}
record[mod]++;
}
return ans;
}
};
3.
class Solution {
public:
long long countSubarrays(vector<int>& nums, long long k) {
long ans=0L,sum=0L;
for(int left=0,right=0;right<nums.size();right++){
sum+=nums[right];
while(sum*(right-left+1)>=k){
sum-=nums[left++];
}
ans+=right-left+1;
}
return ans;
}
};