陣列中的逆序對 歸併排序的變形。

2021-07-28 22:37:55 字數 1739 閱讀 8663

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

輸入描述:

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

資料範圍:

對於%50的資料,size<=10^4

對於%75的資料,size<=10^5

對於%100的資料,size<=2*10^5

輸入例子:

1,2,3,4,5,6,7,0

輸出例子:

7
解法一:
注意:千萬要注意,有時候"="寫成了"==",會讓你debug半天也找不出來。一定要細心。
歸併排序中有個  copy=data的過程,解法一是直接「調換順序」 解法二則是在函式中再賦值一遍。
問題:vector的"="效率竟然沒有挨個挨個的賦值快,這是為啥?

占用記憶體:11148k

class solution 

long long dfs(vector&data,vector©,int start,int end)

int length=(end-start)/2;

long long left=dfs(copy,data,start,start+length);

long long right=dfs(copy,data,start+length+1,end);

int i=start+length;

int j=end;

int copyindex=end;

long long count=0;

while(i>=start&&j>=start+length+1)else

}for (; i >=start; --i)

for (; j >=start+length+1; --j)

return left+right+count;

}};占用記憶體:11148k

class solution 

long long dfs(vector&data,vector©,int start,int end)

int length=(end-start)/2;

long long left=dfs(data,copy,start,start+length);

long long right=dfs(data,copy,start+length+1,end);

int i=start+length;

int j=end;

int copyindex=end;

long long count=0;

while(i>=start&&j>=start+length+1)else

}for (; i >=start; --i)

for (; j >=start+length+1; --j)

//data=copy;//這個不行,但是下個就可以.說明,自帶的複製構造效率極差?

for(int i=start; i<=end; i++)

return left+right+count;

}};

陣列中的逆序對(歸併排序)

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。在歸併排序的一次merge中,r j 1 法一 統計i的逆序數 int merge int a,int p,int q,int r int n1 q p 1,n2 r q in...

陣列中的逆序對(歸併排序)

題目 陣列中的逆序對 思路 典型的歸併排序 很好的題目 這是乙個歸併排序的合併過程,主要考慮合併兩個有序序列時,計算逆序對的個數!對於兩個公升序序列,設定兩個下標 前下標和後下標 初始化為前序列第乙個數字的下標和後序列第乙個數字的下標。如果前下標對應的值大於後下標對應的值,則有 前序列剩下的長度 個...

陣列中的逆序對(歸併排序)

題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 1...