1. 程式人生 > >劍指offer 陣列中的逆序對 python

劍指offer 陣列中的逆序對 python

題目描述

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