国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

(排序) 劍指 Offer 51. 數(shù)組中的逆序對 ——【Leetcode每日一題】

這篇具有很好參考價值的文章主要介紹了(排序) 劍指 Offer 51. 數(shù)組中的逆序對 ——【Leetcode每日一題】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?劍指 Offer 51. 數(shù)組中的逆序對

難度:困難

在數(shù)組中的兩個數(shù)字,如果前面一個數(shù)字大于后面的數(shù)字,則這兩個數(shù)字組成一個逆序對。輸入一個數(shù)組,求出這個數(shù)組中的逆序對的總數(shù)。

示例 1:

輸入: [7,5,6,4]
輸出: 5

限制

  • 0 <= 數(shù)組長度 <= 50000

??思路:歸并排序

預備知識

歸并排序」是用分治思想,分治模式在每一層遞歸上有三個步驟:

  1. 分解(Divide):將 n 個元素分成個含 n/2 個元素的子序列。
  2. 解決(Conquer):用 合并排序法 對兩個子序列遞歸的排序。
  3. 合并(Combine):合并兩個已排序的子序列已得到排序結果。

(排序) 劍指 Offer 51. 數(shù)組中的逆序對 ——【Leetcode每日一題】,LeetCode,leetcode,算法,職場和發(fā)展
具體的我們以一組無序數(shù)列{14,12,15,13,11,16}為例分解說明,如下圖所示:

(排序) 劍指 Offer 51. 數(shù)組中的逆序對 ——【Leetcode每日一題】,LeetCode,leetcode,算法,職場和發(fā)展

在待排序序列長度為 1 的時候,遞歸開始「回升」,因為我們默認長度為 1 的序列是排好序的。

具體思路

那么求逆序對和歸并排序又有什么關系呢?關鍵就在于「歸并」當中「」的過程。

合并階段 本質上是 合并兩個排序數(shù)組 的過程:

  • 每當遇到 左子數(shù)組當前元素 > 右子數(shù)組當前元素 時,意味著
    • 左子數(shù)組當前元素i 至 末尾元素m」 與 「右子數(shù)組當前元素」 構成了若干 「逆序對」 ;
    • 逆序對數(shù) cnts += (m - i + 1) 。
  • 考慮在歸并排序的合并階段統(tǒng)計「逆序對」數(shù)量,完成歸并排序時,也隨之完成所有逆序對的統(tǒng)計。

??代碼:(C++、Java)

C++

class Solution {
private:
    int cnts = 0;
    void mergeSort(vector<int>& nums, vector<int>& tmp, int l, int h){
        if(h - l < 1) return;
        //分解
        int m = l + (h - l) / 2;
        mergeSort(nums, tmp, l, m);
        mergeSort(nums, tmp, m + 1, h);
        //解決 + 合并
        int k = l, i = l, j = m + 1;
        while(i <= m || j <= h){
            if(i > m) tmp[k++] = nums[j++];
            else if(j > h || nums[i] <= nums[j]) tmp[k++] = nums[i++];
            else{//此時i~m對應數(shù)組中的數(shù)都比nums[j]大
                tmp[k++] = nums[j++];
                cnts += (m - i + 1);
            } 
        }
        for(k = l; k <= h; k++){
            nums[k] = tmp[k];
        }
    }
public:
    int reversePairs(vector<int>& nums) {
        vector<int> tmp(nums.size());//輔助數(shù)組,臨時記錄中間合并的子數(shù)組
        mergeSort(nums, tmp, 0, nums.size() - 1);
        return cnts;
    }
};

Java

class Solution {
    private int cnts = 0;
    private void mergeSort(int[] nums, int[] tmp, int l, int h){
        if(h - l < 1) return;
        //分解
        int m = l + (h - l) / 2;
        mergeSort(nums, tmp, l, m);
        mergeSort(nums, tmp, m + 1, h);
        //解決 + 合并
        int k = l, i = l, j = m + 1;
        while(i <= m || j <= h){
            if(i > m) tmp[k++] = nums[j++];
            else if(j > h || nums[i] <= nums[j]) tmp[k++] = nums[i++];
            else{//此時i~m對應數(shù)組中的數(shù)都比nums[j]大
                tmp[k++] = nums[j++];
                cnts += (m - i + 1);
            } 
        }
        for(k = l; k <= h; k++){
            nums[k] = tmp[k];
        }
    }
    public int reversePairs(int[] nums) {
        int[] tmp = new int[nums.length];//輔助數(shù)組,臨時記錄中間合并的子數(shù)組
        mergeSort(nums, tmp, 0, nums.length - 1);
        return cnts;
    }
}
?? 運行結果:

(排序) 劍指 Offer 51. 數(shù)組中的逆序對 ——【Leetcode每日一題】,LeetCode,leetcode,算法,職場和發(fā)展

?? 復雜度分析:
  • 時間復雜度 O ( n l o g n ) O(nlogn) O(nlogn),其中 n 為數(shù)組的長度,同歸并排序 O ( n l o g n ) O(nlogn) O(nlogn)。
  • 空間復雜度 O ( n ) O(n) O(n),歸并排序需要用到一個臨時數(shù)組。

題目來源:力扣。

放棄一件事很容易,每天能堅持一件事一定很酷,一起每日一題吧!
關注我LeetCode主頁 / CSDN—力扣專欄,每日更新!文章來源地址http://www.zghlxwxcb.cn/news/detail-676412.html

注: 如有不足,歡迎指正!

到了這里,關于(排序) 劍指 Offer 51. 數(shù)組中的逆序對 ——【Leetcode每日一題】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • (數(shù)組與矩陣) 劍指 Offer 03. 數(shù)組中重復的數(shù)字 ——【Leetcode每日一題】

    (數(shù)組與矩陣) 劍指 Offer 03. 數(shù)組中重復的數(shù)字 ——【Leetcode每日一題】

    難度:簡單 找出數(shù)組中重復的數(shù)字。 在一個長度為 n 的數(shù)組 nums 里的所有數(shù)字都在 0~n-1 的范圍內。數(shù)組中某些數(shù)字是重復的,但不知道有幾個數(shù)字重復了,也不知道每個數(shù)字重復了幾次。請找出數(shù)組中任意一個重復的數(shù)字。 示例 1: 輸入 : [2, 3, 1, 0, 2, 5, 3] 輸出 :2 或

    2024年02月16日
    瀏覽(20)
  • (鏈表) 劍指 Offer 25. 合并兩個排序的鏈表 ——【Leetcode每日一題】

    (鏈表) 劍指 Offer 25. 合并兩個排序的鏈表 ——【Leetcode每日一題】

    難度:簡單 輸入兩個遞增排序的鏈表,合并這兩個鏈表并使新鏈表中的節(jié)點仍然是遞增排序的。 示例1: 輸入:1-2-4, 1-3-4 輸出:1-1-2-3-4-4 限制 : 0 = 鏈表長度 = 1000 注意:本題與 21. 合并兩個有序鏈表 相同 ??思路: 法一:遞歸 將該問題可以分解成子鏈表,只比較當前 l1 鏈

    2024年02月15日
    瀏覽(21)
  • Leetcode-每日一題【劍指 Offer II 010. 和為 k 的子數(shù)組】

    Leetcode-每日一題【劍指 Offer II 010. 和為 k 的子數(shù)組】

    給定一個整數(shù)數(shù)組和一個整數(shù)?k ,請找到該數(shù)組中和為?k?的連續(xù)子數(shù)組的個數(shù)。 示例 1: 輸入: nums = [1,1,1], k = 2 輸出: 2 解釋: 此題 [1,1] 與 [1,1] 為兩種不同的情況 示例 2: 輸入: nums = [1,2,3], k = 3 輸出: 2 提示: 1 = nums.length = 2 * 104 1000 = nums[i] = 1000 107?= k = 107 前置知識 前綴和

    2024年02月15日
    瀏覽(20)
  • (動態(tài)規(guī)劃) 劍指 Offer 42. 連續(xù)子數(shù)組的最大和 ——【Leetcode每日一題】

    (動態(tài)規(guī)劃) 劍指 Offer 42. 連續(xù)子數(shù)組的最大和 ——【Leetcode每日一題】

    難度:簡單 輸入一個整型數(shù)組,數(shù)組中的一個或連續(xù)多個整數(shù)組成一個子數(shù)組。求所有子數(shù)組的和的最大值。 要求時間復雜度為 O(n) 。 示例1: 輸入: nums = [-2,1,-3,4,-1,2,1,-5,4] 輸出: 6 解釋: 連續(xù)子數(shù)組 [4,-1,2,1] 的和最大,為 6。 提示 : 1 = a r r . l e n g t h = 1 0 5 1 = arr.length = 10^

    2024年02月11日
    瀏覽(27)
  • (搜索) 劍指 Offer 12. 矩陣中的路徑 ——【Leetcode每日一題】

    (搜索) 劍指 Offer 12. 矩陣中的路徑 ——【Leetcode每日一題】

    難度:中等 給定一個 m * n 二維字符網格 board 和一個字符串單詞 word 。如果 word 存在于網格中,返回 true ;否則,返回 false 。 單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許

    2024年02月12日
    瀏覽(28)
  • 每天一道leetcode:劍指 Offer 53 - I. 在排序數(shù)組中查找數(shù)字 I(適合初學者&二分查找)

    每天一道leetcode:劍指 Offer 53 - I. 在排序數(shù)組中查找數(shù)字 I(適合初學者&二分查找)

    統(tǒng)計一個數(shù)字在排序數(shù)組中出現(xiàn)的次數(shù)。 0 = nums.length = 10^5 -10^9 = nums[i] = 10^9 nums 是一個非遞減數(shù)組 -10^9 = target = 10^9 使用兩次二分查找找到target在數(shù)組中的左右邊界,然后長度就是右邊界減去左邊界再加一,最后返回長度即可。 ? 歡迎大家在評論區(qū)討論,如有不懂的代碼部分

    2024年02月14日
    瀏覽(27)
  • Leetcode 劍指 Offer II 038. 每日溫度

    題目難度: 中等 原題鏈接 今天繼續(xù)更新 Leetcode 的劍指 Offer(專項突擊版)系列, 大家在公眾號 算法精選 里回復 劍指offer2 就能看到該系列當前連載的所有文章了, 記得關注哦~ 請根據每日 氣溫 列表 temperatures ,重新生成一個列表,要求其對應位置的輸出為:要想觀測到更高的

    2024年02月14日
    瀏覽(20)
  • Leetcode-每日一題【劍指 Offer 29. 順時針打印矩陣】

    Leetcode-每日一題【劍指 Offer 29. 順時針打印矩陣】

    輸入一個矩陣,按照從外向里以順時針的順序依次打印出每一個數(shù)字。 示例 1: 輸入: matrix = [[1,2,3],[4,5,6],[7,8,9]] 輸出: [1,2,3,6,9,8,7,4,5] 示例 2: 輸入: matrix =?[[1,2,3,4],[5,6,7,8],[9,10,11,12]] 輸出: [1,2,3,4,8,12,11,10,9,5,6,7] 限制: 0 = matrix.length = 100 0 = matrix[i].length?= 100 1.題目要求

    2024年02月13日
    瀏覽(28)
  • (鏈表) 劍指 Offer 24. 反轉鏈表 ——【Leetcode每日一題】

    (鏈表) 劍指 Offer 24. 反轉鏈表 ——【Leetcode每日一題】

    難度:簡單 定義一個函數(shù),輸入一個鏈表的頭節(jié)點,反轉該鏈表并輸出反轉后鏈表的頭節(jié)點。 示例: 輸入 : 1-2-3-4-5-NULL 輸出 : 5-4-3-2-1-NULL 限制 : 0 = 節(jié)點個數(shù) = 5000 注意:本題與 206. 反轉鏈表 相同。 ??思路: 法一:遞歸 可以將本問題分解成子問題: 1 - (剩余部分的反轉)

    2024年02月15日
    瀏覽(29)
  • Leetcode-每日一題【劍指 Offer 16. 數(shù)值的整數(shù)次方】

    Leetcode-每日一題【劍指 Offer 16. 數(shù)值的整數(shù)次方】

    實現(xiàn)?pow(x,?n)?,即計算 x 的 n 次冪函數(shù)(即,xn)。不得使用庫函數(shù),同時不需要考慮大數(shù)問題。 示例 1: 輸入: x = 2.00000, n = 10 輸出: 1024.00000 示例 2: 輸入: x = 2.10000, n = 3 輸出: 9.26100 示例 3: 輸入: x = 2.00000, n = -2 輸出: 0.25000 解釋: 2-2 = 1/22 = 1/4 = 0.25 提示: -10

    2024年02月13日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包