題目描述
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。 即輸出p%1000000007
輸入描述:
題目保證輸入的陣列中沒有的相同的數字
資料範圍:
對於%50的資料,size<=10^4
對於%75的資料,size<=10^5
對於%100的資料,size<=2*10^5
示例1輸入
複製1,2,3,4,5,6,7,0
輸出複製
7
首先就想到了暴力法,肯定是超時了:
# -*- coding:utf-8 -*-
class
solution
:def
inversepairs
(self, data)
:# write code here
iflen
(data)
<=1:
return
0 count =
0for i in
range
(len
(data)-1
):for j in
range
(i+1
,len
(data)):
if data[i]
> data[j]
: count +=
1return count%
1000000007
還可以先將原序列排序,然後從排完序的陣列中取出最小的,它在原陣列中的位置表示有多少比它大的數在它前面,每取出乙個在原陣列中刪除該元素,保證後面取出的元素在原陣列中是最小的,這樣其位置才能表示有多少比它大的數在它前面,即逆序對數。這樣還是超時~~~
# -*- coding:utf-8 -*-
class
solution
:def
inversepairs
(self, data)
:# write code here
copy, count =
,0for num in data:
copy.sort(
)for num in copy:
count += data.index(num)
# 最小值index位置表示前面有index個元素大於它
data.remove(num)
# 移除這個num
return count%
1000000007
下面基於歸併,能通過75%:# -*- coding:utf-8 -*-
class
solution
:def
inversepairs
(self, data)
:# write code here
global count
count =
0def
merge_sort
(data)
:global count
iflen(data)
<=1:
return data
mid, array =
len(data)//2
,[] left_a, right_a = merge_sort(data[
:mid]
), merge_sort(data[mid:])
left, right =0,
0while left <
len(left_a)
and right <
len(right_a)
:# 左右已經有序
if left_a[left]
<= right_a[right]:)
left +=
1else:)
count +=
len(left_a)
-left # 若右邊小則要加上所有左邊剩下的
right +=
1 array += left_a[left:
] array += right_a[right:
]return array
res = merge_sort(data)
return count%
1000000007
python就到不了2s之內呀!佛了~~~:# -*- coding:utf-8 -*-
class
solution
:def
inversepairs
(self, data)
:# write code here
global count
count =
0def
merge_sort
(data)
:global count
iflen(data)
<=1:
return data
mid =
len(data)//2
left_a, right_a = merge_sort(data[
:mid]
), merge_sort(data[mid:])
left, right, index =0,
0,0while left <
len(left_a)
and right <
len(right_a)
:# 左右已經有序
if left_a[left]
<= right_a[right]
: data[index]
= left_a[left]
left +=
1else
: data[index]
= right_a[right]
count +=
len(left_a)
-left # 若右邊小則要加上所有左邊剩下的
right +=
1 index +=
1while left <
len(left_a)
: data[index]
= left_a[left]
left +=
1 index +=
1while right <
len(right_a)
: data[index]
= right_a[right]
right +=
1 index +=
1return data
res = merge_sort(data)
return count%
1000000007
劍指Offer(35) 陣列中的逆序對
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007。例如輸入,輸出5對。分治思想,採用歸併排序的思路來處理。在合併兩個有序序列時,同時計算逆序對數。對...
劍指Offer 35 陣列中的逆序對
題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 1...
劍指Offer 35 陣列中的逆序對
題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字資料範圍 對於 50的資料,size 10...