LeetCode 493. 翻轉對(歸併排序 || 離散化+樹狀陣列)
- 方法一
class Solution {
public:
int reversePairs(vector<int>& nums) {
return div(nums,0,nums.size()-1);
}
int div(vector<int> &nums,int l,int r){
if(l>=r) return 0;
int mid = l+(r-l)/2;
int res = div(nums,l,mid)+div(nums,mid+1,r);
// 合併
int j = 0;
for(int i=l;i<=mid;i++){
while(j+mid+1<=r && (long)nums[i]>(long)2*nums[j+mid+1]){
j++;
}
res += j;
}
vector<int> v(r-l+1);
int i = l;
j = mid+1;
int pos = 0;
while(i<=mid && j<=r){
if(nums[i]<=nums[j]) v[pos++] = ( nums[i++] );
else v[pos++] = ( nums[j++] );
}
while(i<=mid) v[pos++] = ( nums[i++] );
while(j<=r) v[pos++] = ( nums[j++] );
pos = 0;
for(i=l;i<=r;i++){
nums[i] = v[pos++];
}
return res;
}
};
- 方法二
class BIT{
private:
static const int N = 100010;
int c[N] = {0};
int lowbit(int x){
return x&-x;
}
public:
void update(int x){
while(x<N){
c[x]++;
x += lowbit(x);
}
}
int ask(int x){
int res = 0;
while(x){
res += c[x];
x -= lowbit(x);
}
return res;
}
};
class Solution {
public:
int reversePairs(vector<int>& nums) {
set<long> st;
for(long x:nums){
st.insert(x);
st.insert(2*x);
}
unordered_map<long,int> f;
// 從1開始
int index = 1;
for(long x:st){
f[x] = index++;
}
BIT bit;
int ans = 0;
for(long x:nums){
int left = f[2*x];
ans += bit.ask(index)-bit.ask(left);
bit.update(f[x]);
}
return ans;
}
};
相關文章
- LeetCode C++ 劍指 Offer 51. 陣列中的逆序對【歸併排序/樹狀陣列/線段樹】LeetCodeC++陣列排序
- Leetcode 327. 區間和的個數 (字首和 + 離散化 + 樹狀陣列)LeetCode陣列
- HDU 5862 Counting Intersections(樹狀陣列+掃描線+離散化)陣列
- 【LeetCode】493. Reverse Pairs 翻轉對(Hard)(JAVA)LeetCodeAIJava
- 陣列及陣列物件操作 ----------包括排序,去重,合併,翻轉等陣列物件排序
- 樹狀陣列和逆序對陣列
- LeetCode 33——搜尋旋轉排序陣列LeetCode排序陣列
- LeetCode 關於陣列的相對排序LeetCode陣列排序
- 樹狀陣列陣列
- LeetCode 81——搜尋旋轉排序陣列 IILeetCode排序陣列
- LeetCode33. 搜尋旋轉排序陣列LeetCode排序陣列
- LeetCode#33搜尋旋轉排序陣列LeetCode排序陣列
- LeetCode33 搜尋旋轉排序陣列LeetCode排序陣列
- 【LeetCode(Java) - 33】搜尋旋轉排序陣列LeetCodeJava排序陣列
- leetCode33搜尋旋轉排序陣列LeetCode排序陣列
- 解析樹狀陣列陣列
- leetcode, LC68:旋轉排序陣列搜尋LeetCode排序陣列
- HDU 2689 Sort it【樹狀陣列求逆序對】陣列
- LeetCode將有序陣列轉化為二叉搜尋樹--JavaLeetCode陣列Java
- 翻轉int陣列陣列
- PHP 陣列轉樹結構/樹結構轉陣列PHP陣列
- 歸併排序:陣列和連結串列的多種實現排序陣列
- 二維樹狀陣列陣列
- 樹狀陣列詳解陣列
- 樹狀陣列基礎陣列
- 樹狀陣列模板題 & (樹狀陣列 1:單點修改,區間查詢)陣列
- LeetCode1122. 陣列的相對排序(20201114每日一題)LeetCode陣列排序每日一題
- 2個有序陣列,歸併重拍陣列
- 樹狀陣列快速入門陣列
- 【筆記/模板】樹狀陣列筆記陣列
- HDU 2689 【歸併排序求逆序對】排序
- 【LeetCode】905.按奇偶排序陣列LeetCode排序陣列
- C++快速排序與歸併排序的實現(LeetCode 912)C++排序LeetCode
- 歸併排序排序
- LeetCode 189 旋轉陣列LeetCode陣列
- 快速排序&&歸併排序排序
- POJ-2352 Stars(樹狀陣列)陣列
- 樹狀陣列模板+習題集陣列