劍指offer35 陣列中的逆序對

2021-09-09 07:09:38 字數 3546 閱讀 2134

題目描述

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數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...