1. 程式人生 > >數組中的逆序對

數組中的逆序對

span -- 通過 else 返回 n) 輸入一個數 spa tor

題目描述

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

輸入描述:

題目保證輸入的數組中沒有的相同的數字

數據範圍:

對於%50的數據,size<=10^4

對於%75的數據,size<=10^5

對於%100的數據,size<=2*10^5

  思路:暴力法時間復雜度為O(n^2),基於歸並排序的解法時間復雜度為O(nlogn)

  ps:一直納悶為什麽要輸出P%1000000007而不是直接輸出P,直到寫完提交以後,通過率為50%,原因是我的答案竟然出現了負數,才發現int裝不下,改用long,然而函數返回值又要求是int,恍然大悟P%1000000007!!!!!  嗯,一切又解釋得通了,世界又變得美好了。。。

 1 class Solution {
 2 public:
 3     long Merge(int *tmp, vector<int> &data, int left, int mid, int right)
 4     {
 5         long count=0;
 6         int i, j, k;
 7         for(i=mid, j=right, k=right; i>=left && j>=mid+1; --k)
 8         {
 9             if(tmp[i]>tmp[j])
10 { 11 count=count+j-mid; 12 data[k]=tmp[i--]; 13 }else{ 14 data[k]=tmp[j--]; 15 } 16 } 17 while(i>=left)data[k--]=tmp[i--]; 18 while(j>=mid+1)data[k--]=tmp[j--]; 19 for
(int idx=left; idx<=right; ++idx)tmp[idx]=data[idx]; 20 return count; 21 } 22 long MergeSort(vector<int> &data, int *tmp, int left, int right) 23 { 24 if(left==right) 25 { 26 tmp[left]=data[left]; 27 return 0; 28 }else{ 29 int mid=(left+right)/2; 30 long val1=MergeSort(data, tmp, left, mid); 31 long val2=MergeSort(data, tmp, mid+1, right); 32 long val3=Merge(tmp, data, left, mid, right); 33 return val1+val2+val3; 34 } 35 } 36 int InversePairs(vector<int> data) { 37 if(data.size()<=1)return 0; 38 int *tmp=new int[data.size()];//輔助數組 39 long res=MergeSort(data, tmp, 0, data.size()-1);//歸並排序 40 delete []tmp; 41 return res%1000000007; 42 } 43 };

數組中的逆序對