前言
欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
今天是六月集训第二十五天:树状数组🔥🔥🔥🔥🔥
一、练习题目
二、算法思路
- 1、剑指 Offer 51. 数组中的逆序对:困难题🔥🔥🔥🔥🔥
- 2、493. 翻转对:困难题🔥🔥🔥🔥🔥
三、源码剖析
// 剑指 Offer 51. 数组中的逆序对
class Solution {
#define Max 100005
int c[Max];
void init(){
memset(c,0,sizeof(c));
}
int low_bit(int x){
return x&(-x);
}
void add(int x,int maxv,int d){
while(x<=maxv){
c[x]+=d;
x+=low_bit(x);
}
}
int sum(int x){
int s=0;
while(x>0){
s+=c[x];
x-=low_bit(x);
}
return s;
}
int bin(vector<int>& tmp,int v){
int l=0,r=tmp.size()-1;
while(l<=r){
int mid=l+((r-l)>>1);
if(tmp[mid]<v){
l=mid+1;
}else if(tmp[mid]>v){
r=mid-1;
}else {
return mid;
}
}
return -1;
}
public:
int reversePairs(vector<int>& nums) {
init();
vector<int> tmp;
for(int i=0;i<nums.size();++i){
tmp.push_back(nums[i]);
}
sort(tmp.begin(),tmp.end());
tmp.erase(unique(tmp.begin(),tmp.end()),tmp.end());
int ans=0;
for(int i=nums.size()-1;i>=0;--i){
int idx=bin(tmp,nums[i])+1;
ans+=sum(idx-1);
add(idx,nums.size(),1);
}
return ans;
}
};
- 1、看题解的一天。。。
// 493. 翻转对
- 1、