题目来源于知识星球—英雄算法联盟,七月算法集训专题
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
一、327.区间和的个数(困难)
1.题目描述
2.解题思路
看题解学习学习!
3.代码演示(C++)
class Solution
{
#define ll long long
ll s[100010];
vector <ll> bin;
int getIndex(ll val)
{
int l = 0, r = bin.size() - 1;
while(l <= r)
{
int mid = (l + r) >> 1;
if(val > bin[mid])
{
l = mid + 1;
}
else if(val < bin[mid])
{
r = mid - 1;
}
else
{
return mid + 1;
}
}
return -1;
}
int c[300010];
int lowbit(int x)
{
return x & -x;
}
void add(int x, int n)
{
while(x <= n)
{
c[x]++;
x += lowbit(x);
}
}
ll sum(int x)
{
ll s = 0;
while(x)
{
s += c[x];
x -= lowbit(x);
}
return s;
}
public:
int countRangeSum(vector<int>& nums, int l, int u)
{
int i, n = nums.size();
int ans = 0;
bin.clear();
memset(c, 0, sizeof(c));
s[0] = 0;
for(i = 1; i <= n; ++i)
{
s[i] = s[i-1] + nums[i-1];
}
for(i = 0; i <= n; ++i)
{
bin.push_back( s[i] );
bin.push_back( s[i] - u );
bin.push_back( s[i] - l );
}
sort(bin.begin(), bin.end());
bin.erase(unique(bin.begin(), bin.end()), bin.end());
add( getIndex(s[0]),bin.size());
for(i = 1; i <= n; ++i)
{
ans += sum(getIndex(s[i]-l)) - sum(getIndex(s[i]-u)-1);
add( getIndex(s[i]), bin.size());
}
return ans;
}
};
4.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!