劍指Offer(三十五):數組中的逆序對

劍指Offer(三十五):數組中的逆序對

搜索微信公衆號:'AI-ming3526'或者'計算機視覺這件小事' 獲取更多算法、機器學習乾貨python

csdn:https://blog.csdn.net/baidu_31657889/git

github:https://github.com/aimi-cn/AILearnersgithub

1、引子

這個系列是我在牛客網上刷《劍指Offer》的刷題筆記,旨在提高下本身的算法能力。
查看完整的劍指Offer算法題解析請點擊CSDN和github連接:
劍指Offer完整習題解析CSDN地址
github地址算法

2、題目

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

輸出:

7

一、思路

首先咱們先明白題目的意思,好比一個數組{7,5,6,4},它的逆序對總共有五對,{7,5},{7,6},{7,4},{5,4},{6,4} 只要是前面比後面大就組成一個逆序對。

看到這個題目,咱們的第一反應是順序掃描整個數組。每掃描到一個數組的時候,逐個比較該數字和它後面的數字的大小。若是後面的數字比它小,則這兩個數字就組成了一個逆序對。假設數組中含有n個數字。因爲每一個數字都要和O(n)這個數字比較,所以這個算法的時間複雜度爲O(n^2)。

如今用上面說的這種方式是一種時間複雜度比較高的一種,咱們換一種思路,採用歸併排序的方法。

file

先把數組分解成兩個長度爲2的子數組,再把這兩個子數組分解成兩個長度爲1的子數組。接下來一邊合併相鄰的子數組,一邊統計逆序對的數目。在第一對長度爲1的子數組{7}、{5}中7>5,所以(7,5)組成一個逆序對。一樣在第二對長度爲1的子數組{6},{4}中也有逆序對(6,4),因爲已經統計了這兩對子數組內部的逆序對,所以須要把這兩對子數組進行排序,避免在以後的統計過程當中重複統計。

file

逆序對的總數 = 左邊數組中的逆序對的數量 + 右邊數組中逆序對的數量 + 左右結合成新的順序數組時中出現的逆序對的數量

二、編程實現

python

代碼實現方案:

# -*- coding:utf-8 -*-
class Solution:
    def InversePairs(self, data):
        # write code here
        if not data:
            return 0
        temp = [i for i in data]
        return self.mergeSort(temp, data, 0, len(data)-1) % 1000000007
    def mergeSort(self, temp, data, low, high):
        if low >= high:
            temp[low] = data[low]
            return 0
        mid = (low + high) / 2
        left = self.mergeSort(data, temp, low, mid)
        right = self.mergeSort(data, temp, mid+1, high)
        count = 0
        i = low
        j = mid+1
        index = low
        while i <= mid and j <= high:
            if data[i] <= data[j]:
                temp[index] = data[i]
                i += 1
            else:
                temp[index] = data[j]
                count += mid-i+1
                j += 1
            index += 1
        while i <= mid:
            temp[index] = data[i]
            i += 1
            index += 1
        while j <= high:
            temp[index] = data[j]
            j += 1
            index += 1
        return count + left + right複製代碼

AIMI-CN AI學習交流羣【1015286623】 獲取更多AI資料

分享技術,樂享生活:咱們的公衆號計算機視覺這件小事每週推送「AI」系列資訊類文章,歡迎您的關注!

本文由博客一文多發平臺 OpenWrite 發佈!

相關文章
相關標籤/搜索