利用归并排序+二分查找
ps:注意corner case 保存前缀数组的时候以long保存。
class Solution {
public:int countRangeSum(vector<int>& nums, int lower, int upper) {
int len=nums.size();
if( len <=0 )return 0;
vector<long> sums(len+1,0);
for(int i=1;i<= len;i++){
sums[i]=sums[i-1]+nums[i-1];
}
return mergeCount(sums,lower,upper,0,len);
}
private:
int mergeCount(vector<long>& nums, int lower, int upper,int s,int e){
if(s>=e)return 0;
int ret=0,m=(s+e)>>1;
ret=mergeCount(nums,lower,upper ,s,m)+mergeCount(nums, lower, upper,m+1,e);
for(int i=s;i<=m;i++){
int l1=m+1,l2=m+1,r1=e,r2=e,m1,m2;
while(l1<=r1){
m1=(r1+l1)>>1;
if(nums[m1]-nums[i]<lower){
l1=m1+1;
}else{
r1=m1-1;
}
}
if(l1>e)continue;
while(l2<=r2){
m2=(r2+l2)>>1;
if(nums[m2]-nums[i]>upper){
r2=m2-1;
}else{
l2=m2+1;
}
}
ret+=l2-l1;
}
inplace_merge(nums.begin()+s,nums.begin()+m+1,nums.begin()+e+1);
return ret;
}
};