數(shù)組小和(單調(diào)和)

數(shù)組小和的定義如下:例如,數(shù)組s=[1,3,5,2,4,6]
在s[0]的左邊小于或等于s[0]的數(shù)的和為0
在s[1]的左邊小于或等于s[1]的數(shù)的和為1
在s[2]的左邊小于或等于s[2]的數(shù)的和為1+3=4
在s[3]的左邊小于或等于s[3]的數(shù)的和為1
在s[4]的左邊小于或等于s[4]的數(shù)的和為1+3+2=6
在s[5]的左邊小于或等于s[5]的數(shù)的和為1+3+5+2+4=15
所以s的小和為0+1+4+1+6+15=27
給定一個(gè)數(shù)組s,實(shí)現(xiàn)函數(shù)返回s的小和涂乌。

對(duì)于本題埂淮,最容易想到的就是通過(guò)二重循環(huán)暴力求解寄雀,時(shí)間復(fù)雜度O(n^2)炒俱,代碼如下:

public class ArraySmallSum {

    public static void main(String[] args) {
        int[] arr = {1, 3, 5, 2, 4, 6};
        int smallSum = 0;
        for (int i = 1; i < arr.length; i++) {
            for (int j = 0; j < i; j++) {
                if (arr[j] < arr[i]) {
                    smallSum += arr[j];
                }
            }
        }
        System.out.println(smallSum);
    }
}

這樣的時(shí)間復(fù)雜度顯然是不能令人滿意的巷燥,這里我們利用歸并排序赡盘,在對(duì)有序子數(shù)組進(jìn)行merge的同時(shí),累加數(shù)組小和缰揪,時(shí)間復(fù)雜度O(nlogn)陨享,代碼如下:

public class ArraySmallSum {

    public static void main(String[] args) {
        int[] arr = {1, 3, 5, 2, 4, 6};
        System.out.println(getSmallSum(arr));
    }


    public static int getSmallSum(int[] arr) {
        if (arr == null || arr.length == 0) {
            return 0;
        }
        return mergeSortRecursion(arr, 0, arr.length - 1);
    }

    /**
     * 遞歸實(shí)現(xiàn)歸并排序
     *
     * @param arr
     * @param l
     * @param r
     * @return 返回?cái)?shù)組小和
     */
    public static int mergeSortRecursion(int[] arr, int l, int r) {
        if (l == r) {   // 當(dāng)待排序數(shù)組長(zhǎng)度為1時(shí),遞歸開(kāi)始回溯钝腺,進(jìn)行merge操作
            return 0;
        }
        int mid = (l + r) / 2;
        return mergeSortRecursion(arr, l, mid) + mergeSortRecursion(arr, mid + 1, r) + merge(arr, l, mid, r);
    }

    /**
     * 合并兩個(gè)已排好序的數(shù)組s[left...mid]和s[mid+1...right]
     *
     * @param arr
     * @param left
     * @param mid
     * @param right
     * @return 返回合并過(guò)程中累加的數(shù)組小和
     */
    public static int merge(int[] arr, int left, int mid, int right) {
        int[] temp = new int[right - left + 1];    // 輔助存儲(chǔ)空間 O(n)
        int index = 0;
        int i = left;
        int j = mid + 1;
        int smallSum = 0;       // 新增抛姑,用來(lái)累加數(shù)組小和
        while (i <= mid && j <= right) {
            if (arr[i] <= arr[j]) {
                // 當(dāng)前一個(gè)數(shù)組元素小于或等于后一個(gè)數(shù)組元素時(shí),累加小和
                // s[i] <= s[j] -> s[i] <= s[j]...s[right]
                smallSum += arr[i] * (right - j + 1);
                temp[index++] = arr[i++];
            } else {
                temp[index++] = arr[j++];
            }
        }
        while (i <= mid) {
            temp[index++] = arr[i++];
        }
        while (j <= right) {
            temp[index++] = arr[j++];
        }
        for (int k = 0; k < temp.length; k++) {
            arr[left++] = temp[k];
        }
        return smallSum;
    }
}

叛藓客網(wǎng)有道數(shù)組單調(diào)和定硝,實(shí)際上和該題為同一道題。
另一道數(shù)組中的逆序?qū)?/a>毫目,與該題解法類(lèi)似蔬啡,只是merge時(shí)逆序?qū)Φ睦奂訔l件和算法有所不同,此時(shí)merge操作的代碼如下:

/**
 * 合并兩個(gè)已排好序的數(shù)組s[left...mid]和s[mid+1...right]
 *
 * @param arr
 * @param left
 * @param mid
 * @param right
 * @return 返回合并過(guò)程中累加逆序?qū)? */
public static int merge(int[] arr, int left, int mid, int right) {
    int[] temp = new int[right - left + 1];    // 輔助存儲(chǔ)空間 O(n)
    int index = 0;
    int i = left;
    int j = mid + 1;
    int inverseNum = 0;       // 新增蒜茴,用來(lái)累加數(shù)組逆序?qū)?    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) {
            temp[index++] = arr[i++];
        } else {
            // 當(dāng)前一個(gè)數(shù)組元素大于后一個(gè)數(shù)組元素時(shí)星爪,累加逆序?qū)?            // s[i] > s[j] -> s[i]...s[mid] > s[j]
            inverseNum += (mid - i + 1);
            temp[index++] = arr[j++];
        }
    }
    while (i <= mid) {
        temp[index++] = arr[i++];
    }
    while (j <= right) {
        temp[index++] = arr[j++];
    }
    for (int k = 0; k < temp.length; k++) {
        arr[left++] = temp[k];
    }
    return inverseNum;
}
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市粉私,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌近零,老刑警劉巖诺核,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異久信,居然都是意外死亡窖杀,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)裙士,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)入客,“玉大人,你說(shuō)我怎么就攤上這事腿椎∽懒颍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵啃炸,是天一觀的道長(zhǎng)铆隘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)南用,這世上最難降的妖魔是什么膀钠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任掏湾,我火速辦了婚禮,結(jié)果婚禮上肿嘲,老公的妹妹穿的比我還像新娘融击。我一直安慰自己,他們只是感情好雳窟,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布尊浪。 她就那樣靜靜地躺著,像睡著了一般涩拙。 火紅的嫁衣襯著肌膚如雪际长。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天兴泥,我揣著相機(jī)與錄音工育,去河邊找鬼。 笑死搓彻,一個(gè)胖子當(dāng)著我的面吹牛如绸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旭贬,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼怔接,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了稀轨?” 一聲冷哼從身側(cè)響起扼脐,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奋刽,沒(méi)想到半個(gè)月后瓦侮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡佣谐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年肚吏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狭魂。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罚攀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雌澄,到底是詐尸還是另有隱情斋泄,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布掷伙,位于F島的核電站是己,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏任柜。R本人自食惡果不足惜卒废,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一沛厨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摔认,春花似錦逆皮、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至抹蚀,卻和暖如春剿牺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背环壤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工晒来, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人郑现。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓湃崩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親接箫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子攒读,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,724評(píng)論 0 33
  • 第5章 引用類(lèi)型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類(lèi)型 使用基本類(lèi)型...
    大學(xué)一百閱讀 3,212評(píng)論 0 4
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理辛友,服務(wù)發(fā)現(xiàn)薄扁,斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 數(shù)組系列文章也到尾聲了废累,這是數(shù)組系列的最后一篇文章泌辫,后面就是樹(shù)的內(nèi)容了,如果后面又看到了相關(guān)的題目再作補(bǔ)充吧九默,歡迎...
    zero_sr閱讀 462評(píng)論 0 2
  • 001雨天,聽(tīng)一個(gè)“非主流音樂(lè)人”講音樂(lè)宾毒,是一種極好的體驗(yàn)驼修。 002人生在于體驗(yàn),沒(méi)有體驗(yàn)就創(chuàng)作不出打動(dòng)人心的作品...
    海鷗老師閱讀 334評(píng)論 0 0