在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。
示例1:
輸入: [7,5,6,4]
輸出: 5
限制:
0 <= 陣列長度 <= 50000
維護乙個有序陣列orderedarray
,從大到小;
將輸入陣列中的元素依次插入有序陣列orderedarray
中,插入時採用二分法確定位置;
獲得每個插入有序陣列後的下表,即為此元素所結尾的有序陣列的個數;
時間複雜度o(n
logn)
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)
指i
和j
指向元素的值)
使用歸併排序的思想,當元素分組至每組僅有乙個元素時,代表該組已經有序,返回此有序陣列中逆序對的個數為0,隨後進行歸併,並記錄每次歸併所產生的陣列的逆序對的個數。
時間複雜度o(n
logn)
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對於...