《劍指offer》數組中的逆序對(python)

題目描述

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

解題思路

1、一般思路,一個一個比較,時間複雜度o(n*n),牛客網不通過,超時,只能完成25%的用例測試

2、拷貝該數組後對拷貝的數組排序。計算數組中的最小值在原始數組中出現的位置,統計原始數組中最小值前面的個數,之後在原始數組中去掉最小值。重複上述步驟。牛客網依然不通過,超時,只能完成50% 的用例測試

參考:https://blog.csdn.net/u010005281/article/details/80099333

3、歸併算法變體

參考:https://blog.csdn.net/zd_nupt/article/details/81411721

#思路1
# -*- coding:utf-8 -*-
class Solution:
    def InversePairs(self, data):
        count=0
        for i in range(len(data)):
            for j in range(i+1,len(data)):
                if data[i]>data[j]:
                    count+=1
        return count

#思路2
# -*- coding:utf-8 -*-
class Solution:
    def InversePairs(self, data):
        # write code here
        sortData = sorted(data)
        count = 0
        for i in sortData:
            pos = data.index(i)
            count += pos
            data.pop(pos)
        return count

#思路3
import copy
class Solution:
    def process(self,data,temp,start,end):
        if start==end:
            return 0
        mid=(start+end)>>1
        left=self.process(temp,data,start,mid)
        right=self.process(temp,data,mid+1,end)
        r1=mid
        r2=end
        k=end
        count=0
        while r1>=start and r2>=mid+1:
            if data[r1]>data[r2]:
                temp[k]=data[r1]
                k=k-1
                r1=r1-1
                count+=r2-mid
            else:
                temp[k]=data[r2]
                k=k-1
                r2=r2-1
        while r1>=start:
            temp[k]=data[r1]
            k=k-1
            r1=r1-1
        while r2>=mid+1:
            temp[k]=data[r2]
            k=k-1
            r2=r2-1
        return count+left+right
    def InversePairs(self, data):
        if len(data)<=1:
            return 0
        temp=copy.copy(data)
        num=self.process(data,temp,0,len(data)-1)
        return num%1000000007
        # write code here

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章