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


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

博客文章索引地址

博客文章中代碼的github地址

# 題目

image

# 思路

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

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

image

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

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

image

image

# 代碼

      在數組中的兩個數字,如果前面一個數字大於后面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數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 }




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM