劍指offer 陣列中的逆序對 python
阿新 • • 發佈:2018-12-26
題目描述
在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007
樣例
輸入
1,2,3,4,5,6,7,0
輸出
7
想法一:
第一眼肯定想到兩重迴圈的方法,這個比較簡單就不寫了
那就說一種方法
就是先將列表從小到大排序,然後依次迴圈,每次都取到列表裡最小的數,所以該數之前都是比它大的數字,所以累加每個索引即可(索引從0開始),每次加完之後要從原列表中pop該數.不過用python這樣寫會超時
class Solution1:
def InversePairs(self, data):
Sortdata = self.quick_sort(data)
res = 0
for i in Sortdata:
res += data.index(i)
data.pop(data.index(i))
return res
# 使用的快排
def quick_sort(self, data):
if len(data) < 2:
return data
left = self.quick_sort([i for i in data[1:] if i <= data[0]])
right = self.quick_sort([j for j in data[1:] if j > data[0]])
return left + [data[0]] + right
想法二:
第二個想法就是使用歸併排序,先分再合,分的時候記錄下交換的次數,合的時候,如果出現左邊i 大於右邊 j的時候,說明,左邊i到mid的數都大於j,所以給逆序對數加上mid-i+1.
class Solution:
def InversePairs (self, data):
return self.sort(data[:], 0, len(data)-1, data[:]) % 1000000007
def sort(self, temp, left, right, data):
if right - left < 1:
return 0
if right - left == 1:
if data[left] < data[right]:
return 0
else:
temp[left], temp[right] = data[right], data[left]
return 1
mid = (left + right) // 2
res = self.sort(data, left, mid, temp) + self.sort(data, mid+1, right, temp)
# 合
i = left
j = mid + 1
index = left
while i <= mid and j <= right:
if data[i] <= data[j]:
temp[index] = data[i]
i += 1
else:
temp[index] = data[j]
res += mid - i + 1
j += 1
index += 1
while i <= mid:
temp[index] = data[i]
i += 1
index += 1
while j <= right:
temp[index] = data[j]
j += 1
index += 1
return res
最後
刷過的LeetCode或劍指offer原始碼放在Github上了,希望喜歡或者覺得有用的朋友點個star或者follow。
有任何問題可以在下面評論或者通過私信或聯絡方式找我。
聯絡方式
QQ:791034063
Wechat:liuyuhang791034063
CSDN:https://blog.csdn.net/Sun_White_Boy
Github:https://github.com/liuyuhang791034063