题意:求连续和在区间内的和的个数。
思路:分治,利用归并排序的思想,分成前后两部分。如果sumb [L] - suma[I] > upper sumb[K] - suma[I] > lower,那么L - K之间的和都满足要求。
class Solution {
public:
int countRangeSum(vector<int>& nums, int lower, int upper) {
vector<double> sum;
double tempSum = 0;
sum.push_back(tempSum);
for(int i = 0; i < nums.size(); ++ i) {
tempSum += nums[i];
sum.push_back(tempSum);
}
count = 0;
up = upper, down = lower;
//for(int i = 0; i < sum.size(); ++ i) cout << sum[i] << endl;
sum = merge(sum);
//for(int i = 0; i < sum.size(); ++ i) cout << sum[i] << endl;
return count;
}
vector<double> merge(vector<double> nums) {
if(nums.size() == 1) return nums;
vector<double> first;
vector<double> second;
for(int i = 0; i < nums.size() / 2; ++ i) first.push_back(nums[i]);
for(int i = nums.size() / 2; i < nums.size(); ++ i) second.push_back(nums[i]);
first = merge(first); //cout << first.size();
second = merge(second); //cout << second.size() << endl; cout << endl;
if(first.size() == 0) return second;
if(second.size() == 0) return first;
vector<double> re;
int j = 0;
int k = 0, l = 0;
for(int i = 0; i < first.size(); i ++ ) { //cout << second[k] - first[i] << endl;
while(second[k] - first[i] < down && k < second.size()) k ++;
while(second[l] - first[i] <= up && l < second.size()) l ++;
while(first[i] > second[j] && j < second.size()) re.push_back(second[j ++]);
re.push_back(first[i]);
count += (l - k); //cout << l << " " << k << endl;
}
for(; j < second.size(); j ++) re.push_back(second[j]);
return re;
}
int count;
double up, down;
};