劍指offer-陣列中的逆序對
阿新 • • 發佈:2018-12-20
題目描述
在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007
輸入描述:
題目保證輸入的陣列中沒有的相同的數字
資料範圍:
對於%50的資料,size<=10^4
對於%75的資料,size<=10^5
對於%100的資料,size<=2*10^5
示例1
輸入
1,2,3,4,5,6,7,0
輸出
7
程式碼如下
//在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。 //輸入一個數組,求出這個陣列中的逆序對的總數P。 //例如: //輸入:1,2,3,4,5,6,7,0 //輸出:7 //交換元素 void swap(int a, int b) { a = a + b; b = a - b; b = a - b; } //歸併排序,count用來記錄逆序對數 void merge(vector<int>& vecint, int lo, int mid, int hi, long& count) { int ln = hi - lo; int* temp = new int[ln]; int lm = mid - lo; int mh = hi - mid; for(int i = mid-1, j = hi-1; (lo <= i) || ( mid <= j);) { if(lo <= i && mid <= j && vecint[i] > vecint[j]) { count += j - mid + 1; temp[--ln] = vecint[i--]; } if(mid <= j && lo <= i && vecint[i] < vecint[j]) temp[--ln] = vecint[j--]; if(i < lo && mid <= j) temp[--ln] = vecint[j--]; if(j < mid && lo <= i) temp[--ln] = vecint[i--]; } for (int i = 0; i < hi - lo; i++) { vecint[lo+i] = temp[i]; } delete[] temp; } //歸併排序,高速低空間版 void merge2(vector<int>& vecint, int lo, int mid, int hi, long& count) { int hb = hi - mid; int lb = mid - lo; int* htemp = new int[hb]; for(int i = 0; i < hb; i++) htemp[i] = vecint[mid+i]; int k = hb - 1; for(int i = mid - 1, j = hi - 1; lo <= i || mid <= j;) { if((lo <= i) && ( k < 0 || htemp[k] < vecint[i])) { count = count + k + 1; vecint[j--] = vecint[i--]; } if((0 <= k) && ( i < lo || vecint[i] < htemp[k])) vecint[j--] = htemp[k--]; } delete[] htemp; } void mergeSort(vector<int>& vecint, int lo, int hi,long& count) { if(hi - lo < 2) return; int mid = (hi + lo) >> 1; mergeSort(vecint, lo, mid, count); mergeSort(vecint, mid,hi, count); merge2(vecint,lo,mid,hi,count); } int InversePairs(vector<int> data) { if(data.empty()) return 0; long count = 0; int size = data.size(); mergeSort(data,0,size,count); return count; } void InversePairsTest() { vector<int> vecint; int a[4] = {7,5,6,4}; for(int i = 0; i < 4; i++) vecint.push_back(a[i]); InversePairs(vecint); getchar(); }