劍指offer 陣列中的逆序對(c

2021-09-24 11:30:07 字數 1361 閱讀 7983

題目描述

在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。

輸入乙個陣列,求出這個陣列中的逆序對的總數。

樣例

輸入:[1,2,3,4,5,6,0]

輸出:6

思路

注:圖中省略了最後一步, 即複製第二個子陣列最後剩餘的4 到輔助陣列中。

(a) p

1p_1

p1​指向的數字大於p

2p_2

p2​指向的數字,表明陣列中存在逆序對。p

2p_2

p2​ 指向的數字是第二個子陣列的第二個數字, 因此第二個子陣列中有兩個數字比7 小。把逆序對數目加2,並把7 複製到輔助陣列,向前移動p

1p_1

p1​和p

3p_3

p3​。

(b) p

1p_1

p1​指向的數字小子p

2p_2

p2​ 指向的數字,沒有逆序對。把p

2p_2

p2​ 指向的數字複製到輔助陣列,並向前移動p

2p_2

p2​ 和p

3p_3

p3​

1p_1

p1​指向的數字大於p

2p_2

p2​ 指向的數字,因此存在逆序對。由於p

2p_2

p2​ 指向的數字是第二個子陣列的第乙個數字,子陣列中只有乙個數字比5 小。把逆序對數目加1 ,並把5複製到輔助陣列,向前移動p

1p_1

p1​和p

3p_3

p3​ 。

**
class

solution

}int

getcount

(vector<

int>

& nums,

int begin,

int end)

// 不存在交叉的逆序對,依次將較大值放進輔助陣列

else

}while

(i >= begin)

while

(j > mid)

//更新歸併排序後的子陣列

for(

int i = begin; i <= end;

++i)

nums[i]

= copy[i]

;return

(leftcount+rightcount+crosscount);}

};

劍指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就加上後乙...