0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

劍指Offer(35):數(shù)組中的逆序?qū)?/h1>

劍指Offer(35):數(shù)組中的逆序?qū)?/h1>

一、引子

這個(gè)系列是我在牛客網(wǎng)上刷《劍指Offer》的刷題筆記,旨在提升下自己的算法能力。
查看完整的劍指Offer算法題解析請(qǐng)點(diǎn)擊CSDN和github鏈接:
劍指Offer完整習(xí)題解析CSDN地址
github地址

二、題目

在數(shù)組中的兩個(gè)數(shù)字,如果前面一個(gè)數(shù)字大于后面的數(shù)字,則這兩個(gè)數(shù)字組成一個(gè)逆序?qū)Α]斎胍粋€(gè)數(shù)組,求出這個(gè)數(shù)組中的逆序?qū)Φ目倲?shù)P。并將P對(duì)1000000007取模的結(jié)果輸出。 即輸出P%1000000007

輸入描述:

題目保證輸入的數(shù)組中沒有的相同的數(shù)字
數(shù)據(jù)范圍:

對(duì)于%50的數(shù)據(jù),size<=10^4

對(duì)于%75的數(shù)據(jù),size<=10^5

對(duì)于%100的數(shù)據(jù),size<=2*10^5

事例1:

輸入:

1,2,3,4,5,6,7,0

輸出:

7

1、思路

首先我們先明白題目的意思,比如一個(gè)數(shù)組{7,5,6,4},它的逆序?qū)偣灿形鍖?duì),{7,5},{7,6},{7,4},{5,4},{6,4} 只要是前面比后面大就組成一個(gè)逆序?qū)Α?/p>

看到這個(gè)題目,我們的第一反應(yīng)是順序掃描整個(gè)數(shù)組。每掃描到一個(gè)數(shù)組的時(shí)候,逐個(gè)比較該數(shù)字和它后面的數(shù)字的大小。如果后面的數(shù)字比它小,則這兩個(gè)數(shù)字就組成了一個(gè)逆序?qū)?。假設(shè)數(shù)組中含有n個(gè)數(shù)字。由于每個(gè)數(shù)字都要和O(n)這個(gè)數(shù)字比較,因此這個(gè)算法的時(shí)間復(fù)雜度為O(n^2)。

現(xiàn)在用上面說的這種方式是一種時(shí)間復(fù)雜度比較高的一種,我們換一種思路,采用歸并排序的方法。

先把數(shù)組分解成兩個(gè)長(zhǎng)度為2的子數(shù)組,再把這兩個(gè)子數(shù)組分解成兩個(gè)長(zhǎng)度為1的子數(shù)組。接下來一邊合并相鄰的子數(shù)組,一邊統(tǒng)計(jì)逆序?qū)Φ臄?shù)目。在第一對(duì)長(zhǎng)度為1的子數(shù)組{7}、{5}中7>5,因此(7,5)組成一個(gè)逆序?qū)?。同樣在第二?duì)長(zhǎng)度為1的子數(shù)組{6},{4}中也有逆序?qū)Γ?,4),由于已經(jīng)統(tǒng)計(jì)了這兩對(duì)子數(shù)組內(nèi)部的逆序?qū)Γ虼诵枰堰@兩對(duì)子數(shù)組進(jìn)行排序,避免在之后的統(tǒng)計(jì)過程中重復(fù)統(tǒng)計(jì)。

逆序?qū)Φ目倲?shù) = 左邊數(shù)組中的逆序?qū)Φ臄?shù)量 + 右邊數(shù)組中逆序?qū)Φ臄?shù)量 + 左右結(jié)合成新的順序數(shù)組時(shí)中出現(xiàn)的逆序?qū)Φ臄?shù)量

2、編程實(shí)現(xiàn)

python

代碼實(shí)現(xiàn)方案:

# -*- 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

分享技術(shù),樂享生活:我們的公眾號(hào)計(jì)算機(jī)視覺這件小事每周推送“AI”系列資訊類文章,歡迎您的關(guān)注!

本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!

審核編輯 黃昊宇
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 人工智能
    +關(guān)注

    關(guān)注

    1791

    文章

    47352

    瀏覽量

    238776
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8422

    瀏覽量

    132724
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    417

    瀏覽量

    25968
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5504

    瀏覽量

    121230
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    offer 06.從頭到尾打印鏈表

    編程語言
    jf_40173672
    發(fā)布于 :2022年07月25日 09:43:38

    數(shù)組的0怎么去掉

    本帖最后由 fqhyf 于 2015-5-14 18:35 編輯 數(shù)組的0怎么去掉
    發(fā)表于 05-14 18:32

    動(dòng)態(tài)規(guī)劃與貪婪法題的背包問題總結(jié)

    【LeetCode & offer刷題】動(dòng)態(tài)規(guī)劃與貪婪法題16:背包問題總結(jié)
    發(fā)表于 06-09 16:44

    聚辰半導(dǎo)體通用MCU應(yīng)用

    聚辰半導(dǎo)體通用MCU應(yīng)用 聚辰半導(dǎo)體有限公司的前身是美國(guó)ISSI(Integrated Silicon Solution)全資控股子公司芯成半導(dǎo)體(上海)有限
    發(fā)表于 03-19 08:52 ?1156次閱讀

    C語言教程之逆序存放數(shù)據(jù)

    C語言教程之逆序存放數(shù)據(jù),很好的C語言資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-25 15:03 ?0次下載

    逆序算法程序

    逆序算法程序,其實(shí)也不是那么難,就分享一下,希望大家別介意
    發(fā)表于 05-19 14:31 ?8次下載

    介紹了數(shù)組和簇?cái)?shù)據(jù)類型以及創(chuàng)建和使用數(shù)組和簇的方法

    數(shù)組索引從0開始。 也就是說,如果一維(1D)數(shù)組包含n個(gè)元素,那么索引范圍就是0~n – 1,其中索引0數(shù)組的第一個(gè)元素,索引n
    發(fā)表于 11-16 18:13 ?1.1w次閱讀
    介紹了<b class='flag-5'>數(shù)組</b>和簇?cái)?shù)據(jù)類型以及創(chuàng)建和使用<b class='flag-5'>數(shù)組</b>和簇的方法

    java數(shù)組的三種定義方式_java數(shù)組的定義及使用方法(推薦)

    java數(shù)組是一種很常用的工具,本文將介紹來java數(shù)組的三種定義方式以及java數(shù)組
    發(fā)表于 01-29 09:53 ?3.2w次閱讀

    Offer(37):數(shù)字在排序數(shù)組中出現(xiàn)的次數(shù)

    搜索微信公眾號(hào):'AI-ming3526'或者'計(jì)算機(jī)視覺這件小事' 獲取更多算法、機(jī)器學(xué)習(xí)干貨 csdn:[鏈接] github:[鏈接]
    的頭像 發(fā)表于 12-10 22:40 ?229次閱讀

    如何對(duì)一維數(shù)組做maxpooling

    最近在offer里看到一道算法題很有意思,分享給大家。
    的頭像 發(fā)表于 04-11 08:41 ?2913次閱讀

    C 語言數(shù)組的基本結(jié)構(gòu)

    的元素 求數(shù)組中元素的最短距離 求兩個(gè)有序數(shù)組的共同元素 求三個(gè)數(shù)組的共同元素 找出數(shù)組唯一的重復(fù)元素 找出出現(xiàn)奇數(shù)次的元素 求
    的頭像 發(fā)表于 06-22 10:56 ?610次閱讀

    數(shù)組的定義 什么是數(shù)組

    數(shù)組 數(shù)組是內(nèi)置類型,是一組同類型數(shù)據(jù)的集合,它是值類型,通過從0開始的下標(biāo)索引訪問元素值。 在初始化后長(zhǎng)度是固定的,無法修改其長(zhǎng)度。當(dāng)作為方法的參數(shù)傳入時(shí)將復(fù)制一份數(shù)組而不是引用同一
    的頭像 發(fā)表于 10-09 09:39 ?1916次閱讀

    labview怎么查數(shù)組相同元素的個(gè)數(shù)

    要查找LabVIEW數(shù)組相同元素的個(gè)數(shù),可以使用以下步驟: 創(chuàng)建一個(gè)包含要查找的數(shù)值的數(shù)組。這可以通過手動(dòng)輸入數(shù)組元素或從文件/其他數(shù)據(jù)
    的頭像 發(fā)表于 12-28 16:42 ?3593次閱讀

    PHP數(shù)組的使用方法!

    PHP數(shù)組的使用方法! PHP是一種廣泛使用的網(wǎng)絡(luò)編程語言,它的數(shù)組功能非常強(qiáng)大且靈活。數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),它允許我們?cè)趩蝹€(gè)變量存儲(chǔ)多個(gè)
    的頭像 發(fā)表于 01-12 15:11 ?562次閱讀

    數(shù)組和鏈表在內(nèi)存的區(qū)別 數(shù)組和鏈表的優(yōu)缺點(diǎn)

    數(shù)組和鏈表在內(nèi)存的區(qū)別 數(shù)組和鏈表的優(yōu)缺點(diǎn)? 數(shù)組和鏈表是常見的數(shù)據(jù)結(jié)構(gòu),用于組織和存儲(chǔ)數(shù)據(jù)。它們?cè)趦?nèi)存的存儲(chǔ)方式以及優(yōu)缺點(diǎn)方面存在一些
    的頭像 發(fā)表于 02-21 11:30 ?1057次閱讀