待定
一. 利用归并排序查找左右边界
例题1-- 327. 区间和的个数,给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper。区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。
基本思路:采用归并排序,每一次有两个有序数组,以左边数组里的元素为左边界,在右边数组中找到符合要求的最大元素数目
- 将前缀和数组分为两个有序数组,即左右分别有序数组,s1,s2
- 以s1[i],0<=i<s1.size(),为左边界,在s2上找符合要求的所有元素,
- 递归以上步骤。
vector<long> tmp;
int merge(vector<long> &sum,int l,int r,int &lower,int &upper){
if(r<=l)
return 0; //若前缀和数组从一开始,仅需要改变该处,针对单个元素,return sum[l]>=lower&&sum[l]<=upper;
//计算所有符合要求的自序列个数
int cnt=0;
int mid=(r-l)/2+l;
cnt+=merge(sum,l,mid,lower,upper);//保证右边的数组下标一定大于左边的数组
cnt+=merge(sum,mid+1,r,lower,upper);
int left_pos=l,right_lower=mid+1,right_upper=mid+1;
while(left_pos<=mid){
while(right_lower<=r&&sum[right_lower]-sum[left_pos]<