1. 程式人生 > >劍指offer-陣列中的逆序對

劍指offer-陣列中的逆序對

題目描述

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