劍指 Offer 51 陣列中的逆序對

2021-10-09 13:48:34 字數 1845 閱讀 6427

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

示例1:

輸入: [7,5,6,4]

輸出: 5

限制:

0 <= 陣列長度 <= 50000

維護乙個有序陣列orderedarray,從大到小;

將輸入陣列中的元素依次插入有序陣列orderedarray中,插入時採用二分法確定位置;

獲得每個插入有序陣列後的下表,即為此元素所結尾的有序陣列的個數;

時間複雜度o(n

log⁡n)

o(n\log n)

o(nlogn)

。 **如下:

class

solution

intinsertorderedarray

(int target)

int size = orderedarray.

size()

;int i =0;

int j = size -1;

while

(i <= j)

orderedarray.

insert

(orderedarray.

begin()

+ i, target)

;return i;}}

;

假設給定陣列為[8, 10, 15, 20, 70, 9, 25, 50, 60, 100],這個陣列的前一半和後一半都是有序的,那麼此時這個陣列的逆序對的個數應該如何統計?

指標i指向[8, 10, 15, 20, 70]首元素,指標j指向[9, 25, 50, 60, 100]首元素,比較var(i)var(j)的大小。(這裡var(i)var(j)ij指向元素的值)

使用歸併排序的思想,當元素分組至每組僅有乙個元素時,代表該組已經有序,返回此有序陣列中逆序對的個數為0,隨後進行歸併,並記錄每次歸併所產生的陣列的逆序對的個數。

時間複雜度o(n

log⁡n)

o(n \log n)

o(nlogn)

,空間複雜度o(n

)o(n)

o(n)

。**如下:

class

solution

intmergesort

(vector<

int>

& nums, vector<

int>

& tmp,

int left,

int right)

else

tmp_index++;}

while

(i <= mid)

while

(j <= right)

tmp[tmp_index++

]= nums[j++];

for(tmp_index = left; tmp_index <= right; tmp_index++

) nums[tmp_index]

= tmp[tmp_index]

;return prev_count + curr_count;}}

;

劍指Offer 51 陣列中的逆序對

在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。樣例輸入 1,2,3,4,5,6,0 輸出 6 class solution object definversepairs self,nums type nums list in...

劍指offer 51 陣列中的逆序對

這到題的題目為 陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這兩個陣列中逆序對的總數。解題思路 將陣列分為若干個子陣列,其中每乙個數為乙個子陣列,先統計子陣列內部之間的逆序對,並對它們進行排序。然後統計相鄰兩個子陣列之間的逆序對用於對它們進行排序,直...

劍指offer51 陣列中的逆序對

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