劍指offer 陣列中的逆序對

2021-08-22 10:34:59 字數 1149 閱讀 3631

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

思路:方法1:最直觀的方法,順序掃瞄陣列,每掃瞄到乙個數字,再順序掃瞄其後的每個數字,如果後面的數字比當前數字小,則組成乙個逆序對。這種方法需要兩層迴圈,o(n^2)的複雜度。

方法2:借鑑歸併排序的思路

先把陣列分隔為子陣列,統計子陣列內部的逆序對的數目,然後再統計兩個相鄰子陣列之間的逆序對的數目。

注意:a. 呼叫inversepairscore時,因為要把上一次排好序的結果做合併,所以data和count需要交換,copy中的陣列是排好序的,data是用來做合併的,也就是上一步在copy中排好的子陣列,下一步要作為data進行合併操作放入copy中,如此交替,最後data和copy中的數字完全一樣。

b. 因為在運算元陣列的count過程中可能就超過1000000007溢位了,所以對於每次count增加之後都要對1000000007取模。

(剛開始只在最後一步返回count的時候取模了,case通過率只有50%)

ac**

方法1:case通過率50%,對於很大的陣列時間複雜度過高

class solution 

int inversepairscore(vector&data,vector©,int start,int end)

int length=(end-start)/2;

int left=inversepairscore(copy,data,start,start+length);

int right=inversepairscore(copy,data,start+length+1,end);

int p1=start+length;

int p2=end;

int p3=end;

int count=0;

while(p1>=start && p2>=start+length+1)

else

}while(p1>=start)

while(p2>=start+length+1)

return (left+right+count)%1000000007;

}};

劍指offer 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。解法一 乙個數字能不能構成逆序對,關鍵看後面有幾個比他小的數字。根據這個思路,我們可以從後向前遍歷整個陣列。並用乙個大小為10的陣列,分別來儲存從後向前遍歷陣列時0 9每個數字...

劍指offer 陣列中的逆序對

題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。class solution vector tmp len int res mergesort data,tmp,0,len 1 return res private...

劍指offer 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。分析 類似於mergesort的思想,對於兩個排序的陣列,用兩個指標分別指向末尾,比如p,q,如果p的值大於q,那麼p與q和q之前所有數字都可以組成逆序對,count就加上後乙...