1. 程式人生 > >【劍指offer】數組中的逆序對。C++實現

【劍指offer】數組中的逆序對。C++實現

AC strong HR mage ont color 數組中的逆序對 master blog

原創文章,轉載請註明出處!

博客文章索引地址

博客文章中代碼的github地址

# 題目

技術分享圖片

# 思路

基於歸並排序的思想統計逆序對:先把數組分割成子數組,再子數組合並的過程中統計逆序對的數目。統計逆序對時,先統計子數組內部的逆序對的數目,再統計相鄰子數組的逆序對數目。

1.基於歸並思想統計逆序對的過程

技術分享圖片

2.合並子數組統計逆序對的過程

把長度為2的子數組合並、排序並統計逆序對的過程。

技術分享圖片

技術分享圖片

# 代碼

在數組中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數P。並將P對1000000007取模的結果輸出, 即輸出P%1000000007。題目保證輸入的數組中沒有過相同的數字。

  1 #include <iostream>
  2 #include <vector>
  3 using namespace std;
  4 
  5 class Solution{
  6 public:
  7     int count=0;
  8     int InversePairs(vector<int> data)
  9     {
 10         // 檢查邊界條件
 11         if(data.size() != 0)
 12         {
 13             MergeSort(data,0,data.size()-1);
 14
} 15 return count; 16 } 17 18 private: 19 void MergeSort(vector<int> a, int l, int r) 20 { 21 /* 將長度為n的輸入序列分成兩個長度為n/2的子序列 */ 22 if (l < r) 23 { 24 /* 中間元素*/ 25 int m = (l + r) >>1; 26 27 // 遞歸拆分
28 MergeSort(a, l, m); 29 MergeSort(a, m + 1, r); 30 31 // 遞歸合並 32 Merge(a, l, m, r); 33 } 34 } 35 void Merge(vector<int> a, int l, int m, int r) 36 { 37 vector<int> t; 38 //int p = 0; /* p指向輔助數組 */ 39 int i = l; /* i指向第一個子表 */ 40 int j = m + 1;/* j指向第二個子表 */ 41 42 /* 兩個子表都不為空時 */ 43 while(i <= m && j <= r) 44 { 45 /* 取關鍵字小的元素轉移至臨時數組 */ 46 if (a[i] > a[j]) 47 { 48 t.push_back(a[j++]); 49 count=(count+m-i+1)%1000000007; 50 } 51 else 52 t.push_back(a[i++]); 53 } 54 55 while(i <= m) t.push_back(a[i++]);/* 將非空的輸入區間轉移至輸出區間 */ 56 while(j <= r) t.push_back(a[j++]); 57 58 for (i = 0; i < t.size(); i++) a[l + i] = t[i];/* 歸並完成後將結果復制到原輸入數組 */ 59 } 60 }; 61 62 int main() 63 { 64 vector<int> a = {8,7,6,5,455,88,888,9999,546,46548,1315,445,554,111,5222,2264,8,331,454548}; 65 Solution solution; 66 solution.InversePairs(a); 67 return 0; 68 }



【劍指offer】數組中的逆序對。C++實現