劍指offer:數組中的逆序對

題目描述
在數組中的兩個數字,如果前面一個數字大于后面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數P。并將P對1000000007取模的結果輸出。 即輸出P%1000000007
輸入描述:
題目保證輸入的數組中沒有的相同的數字

創新互聯公司長期為上千多家客戶提供的網站建設服務,團隊從業經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯網生態環境。為蘇尼特左企業提供專業的成都網站制作、網站設計,蘇尼特左網站改版等技術服務。擁有十載豐富建站經驗和眾多成功案例,為您定制開發。

數據范圍:

    對于%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 -*-
# @Time         : 2019-07-12 11:39
# @Author       : Jayce Wong
# @ProjectName  : job
# @FileName     : inversePairs.py
# @Blog         : https://blog.51cto.com/jayce1111
# @Github       : https://github.com/SysuJayce

class Solution:
    """
    要計算數組中的逆序對的對數,那么最直觀的做法就是遍歷整個數組,將當前元素和后續的所有元素進行
    比較,然后累計有多少逆序對。

    另一種解法就是基于歸并排序的解法。
    上述的解法的最大缺陷在于每個數字都要跟后續的所有數字進行比較,導致時間復雜度為O(n^2)。
    如果可以避免這么多次比較,就可以提高效率。
    效仿歸并排序,我們先將一個數組不斷對半分裂,先得到多個長度為1的數組,然后每兩個相鄰數組進行比較
    然后歸并。
    **之所以要進行歸并(將這兩個相鄰數組合并后排序)是因為如果不排序的話,在下一輪的比較的時候會出現
    重復計數的情況**
    由于進行了排序,在下一輪歸并的時候只需要將兩個數組的最大值進行比較,如果左邊的數組的最大值大于
    右邊數組的最大值,那么說明右邊整個數組都可以跟左邊數組的最大值組成逆序對,因此跳過左邊數組最大
    值和右邊剩余元素的比較。
    這種解法其實就是**降序的歸并排序**。
    """

    def InversePairs(self, data):
        def split(start, end):
            # 先將整個數組對半分裂成若干個長度為1的數組
            if start < end:  # start < end,說明長度大于1,繼續分裂
                mid = (start + end) >> 1
                split(start, mid)
                split(mid + 1, end)
                # 分裂完成后,對兩個相鄰數組進行歸并
                # 兩個數組的下標分別為[start, mid], [mid + 1, end]
                merge(start, mid, end)

        def merge(start, mid, end):
            # 由于我們這里的count是InversePairs()里的局部變量,
            # 所以用nonlocal關鍵字而非global
            nonlocal count
            # 由于是進行降序歸并,因此從兩個數組的末尾開始歸并
            p1 = mid
            p2 = end
            while p1 >= start and p2 > mid:
                # 如果左邊大于右邊,說明組成了一個逆序對,
                # 計數器count增加數值為右邊數組的剩余元素個數
                if data[p1] > data[p2]:
                    # count += end - p2 + 1
                    count += p2 - mid
                    # data_copy用于存儲歸并后的結果
                    data_copy.append(data[p1])
                    p1 -= 1
                else:
                    data_copy.append(data[p2])
                    p2 -= 1
            # 將左右數組剩余的元素加入data_copy中,由于是有其中一個數組完全為空了,所以事實上
            # 只將其中一個數組的元素加入data_copy中,而由于我們是利用遞歸實現的,這個數組也早
            # 已有序,因此歸并后的結果data_copy是有序的
            for p in range(p1, start - 1, -1):
                data_copy.append(data[p])
            for p in range(p2, mid, -1):
                data_copy.append(data[p])
            # 將歸并結果賦值到原數組中,注意這里賦值的順序,我們要保證從小到大。
            while data_copy:
                data[start] = data_copy.pop(-1)
                start += 1

        if not data:
            return 0

        count = 0  # 用于統計逆序對的對數
        data_copy = []  # 輔助數組,用于存儲兩個相鄰數組歸并的臨時結果
        split(0, len(data) - 1)
        return count % 1000000007

def main():
    solution = Solution()
    data = [364, 637, 341, 406, 747, 995, 234, 971, 571, 219, 993, 407, 416,
            366, 315, 301, 601, 650, 418, 355, 460, 505, 360, 965, 516, 648,
            727, 667, 465, 849, 455, 181, 486, 149, 588, 233, 144, 174, 557, 67,
            746, 550, 474, 162, 268, 142, 463, 221, 882, 576, 604, 739, 288,
            569, 256, 936, 275, 401, 497, 82, 935, 983, 583, 523, 697, 478, 147,
            795, 380, 973, 958, 115, 773, 870, 259, 655, 446, 863, 735, 784, 3,
            671, 433, 630, 425, 930, 64, 266, 235, 187, 284, 665, 874, 80, 45,
            848, 38, 811, 267, 575]
    # data = [1,2,3,4,5,6,7,0]
    print(solution.InversePairs(data))

if __name__ == '__main__':
    main()

網站欄目:劍指offer:數組中的逆序對
網址分享:http://m.kartarina.com/article24/pihgce.html

成都網站建設公司_創新互聯,為您提供企業建站網站設計網站制作外貿建站網站設計公司

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

外貿網站制作
主站蜘蛛池模板: 曰韩精品无码一区二区三区| 无码人妻丰满熟妇区免费| 无码精品人妻一区二区三区免费看| 人妻丰满熟妇AV无码区HD| 日韩欧精品无码视频无删节| 尤物永久免费AV无码网站| 国产精品99精品无码视亚| 亚洲AV无码专区在线电影成人 | 一本大道无码人妻精品专区| 亚洲AV永久无码精品成人| 国产色无码精品视频国产| 91精品久久久久久无码 | 国产精品无码无片在线观看| 亚洲av永久无码精品网址| 麻豆aⅴ精品无码一区二区| 丰满少妇人妻无码| 国产成人AV无码精品| 国产精品无码一区二区三区毛片| 人妻av无码一区二区三区| 国产亚洲AV无码AV男人的天堂| 免费无码国产在线观国内自拍中文字幕 | H无码精品3D动漫在线观看| 亚洲av无码无线在线观看| 91精品无码久久久久久五月天| 亚洲Av无码精品色午夜| 亚洲精品无码不卡在线播放HE| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 亚洲国产成人精品无码久久久久久综合| 未满小14洗澡无码视频网站| 久久亚洲精品无码AV红樱桃| 日韩免费无码视频一区二区三区| 无码午夜人妻一区二区三区不卡视频| 永久免费av无码网站yy| 亚洲精品无码久久久久| 无码人妻精品一区二区| 国产精品久久久久无码av| 中文字幕无码高清晰| 免费无码又爽又刺激聊天APP| 久久久久久亚洲av无码蜜芽| 日日摸日日碰人妻无码| 精品人妻系列无码人妻免费视频|