LeetCode C++ 劍指 Offer 51. 陣列中的逆序對【歸併排序/樹狀陣列/線段樹】
在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個陣列,求出這個陣列中的逆序對的總數。
示例 1:
輸入: [7,5,6,4]
輸出: 5
限制: 0 <= 陣列長度 <= 50000
解法1 歸併排序
先這麼寫,日後有時間就多更新幾種解法:
class Solution {
private:
int ans = 0;
vector<int> tmp;
void mergeSort(vector<int>& nums, int l, int r) {
if (l >= r) return;
int m = l + (r - l) / 2;
mergeSort(nums, l, m);
mergeSort(nums, m + 1, r);
int i = l, j = m + 1, k = l;
while (i <= m && j <= r) {
if (nums[i] <= nums[j]) tmp[k++] = nums[i++];
else {
tmp[k++] = nums[j++];
ans += j - k;
}
}
while (i <= m) tmp[k++] = nums[i++];
while (j <= r) tmp[k++] = nums[j++];
for (int x = l; x <= r; ++x) nums[x] = tmp[x];
}
public:
int reversePairs(vector<int>& nums) {
if (nums.empty()) return 0;
tmp.resize(nums.size());
mergeSort(nums, 0, nums.size() - 1);
return ans;
}
};
執行效率如下:
執行用時:256 ms, 在所有 C++ 提交中擊敗了92.20% 的使用者
記憶體消耗:43.9 MB, 在所有 C++ 提交中擊敗了47.48% 的使用者
類似的題目還有:LeetCode 315,327,493。
相關文章
- 劍指offer——陣列中的逆序對C++(75%)陣列C++
- 樹狀陣列和逆序對陣列
- 劍指Offer-37-陣列中逆序對陣列
- LeetCode 493. 翻轉對(歸併排序 || 離散化+樹狀陣列)LeetCode排序陣列
- HDU 2689 Sort it【樹狀陣列求逆序對】陣列
- HDU 1556 Color the ball(線段樹|樹狀陣列)陣列
- 樹狀陣列陣列
- 【Leetcode每日一題】327. 區間和的個數(線段樹/樹狀陣列)LeetCode每日一題陣列
- 解析樹狀陣列陣列
- 陣列中的逆序對陣列
- 劍指 offer(1) -- 陣列篇陣列
- Leetcode 劍指 Offer 03. 陣列中重複的數字LeetCode陣列
- 劍指offer——把陣列排成最小的數C++陣列C++
- 二維樹狀陣列陣列
- 樹狀陣列詳解陣列
- 樹狀陣列基礎陣列
- 【劍指offer】二維陣列中的查詢陣列
- 2024年暑假關於線段樹和樹狀陣列的小知識點陣列
- 樹狀陣列模板題 & (樹狀陣列 1:單點修改,區間查詢)陣列
- 劍指Offer--陣列中重複的數字陣列
- 【劍指offer】【1】二維陣列中的查詢陣列
- 樹狀陣列快速入門陣列
- 【筆記/模板】樹狀陣列筆記陣列
- 劍指offer之順序列印陣列陣列
- POJ 3468 【區間修改+區間查詢 樹狀陣列 | 線段樹 | 分塊】陣列
- 二維陣列中的查詢——牛客劍指offer陣列
- 劍指 Offer 04. 二維陣列中的查詢陣列
- 劍指Offer-連續子陣列中的最大和陣列
- 劍指offer:旋轉陣列的最小數字陣列
- 劍指offer 旋轉陣列的最小數字陣列
- JZ-035-陣列中的逆序對陣列
- POJ-2352 Stars(樹狀陣列)陣列
- 樹狀陣列模板+習題集陣列
- 樹狀陣列(我是真小白)陣列
- 資料結構——樹狀陣列資料結構陣列
- 樹狀陣列3種基本操作陣列
- 面試最常問的陣列轉樹,樹轉陣列 c++ web框架paozhu實現面試陣列C++Web框架
- 劍指Offer-39-數字在排序陣列中出現的次數排序陣列