树状数组的讲解:
https://www.cnblogs.com/xenny/p/9739600.html
面试题的答案在此:
https://blog.youkuaiyun.com/优快云_Coder_T/article/details/77456548
http://www.manongjc.com/detail/11-italvzpqijcxbyu.html(这个清楚点)
我自己写的答案:
#include<iostream>
#include<vector>
using namespace std;
int lowbit(int x)
{
return x & (-x);
}
int sum(int i, vector<int>& c)
{
int s = 0;
while (i > 0)
{
s += c[i];
i -= lowbit(i);
}
return s;
}
void add(int i, int val, vector<int>& c)
{
int len = c.size();
while (i < len)
{
c[i] += val;
i += lowbit(i);
}
}
int main()
{
int b[] = {3,1,5,8,2};
vector<int> v(b, b+5);
vector<int> c(101, 0);
int res = 0;
for (int i = 0; i < v.size(); i++)
{
int num = v[i];
res = max(res, i - sum(num, c));
add(num, 1, c);
}
cout << res << endl;
return 0;
}
leetcode上的树状数组题目:
307 range sum