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

【LeetCode】劍指 Offer(26)

這篇具有很好參考價值的文章主要介紹了【LeetCode】劍指 Offer(26)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

題目:劍指 Offer 51. 數(shù)組中的逆序?qū)?- 力扣(Leetcode)

題目的接口:

解題思路:

代碼:

過啦?。?!

寫在最后:


題目:劍指 Offer 51. 數(shù)組中的逆序?qū)?- 力扣(Leetcode)

【LeetCode】劍指 Offer(26)

題目的接口:

class Solution {
public:
    int reversePairs(vector<int>& nums) {

    }
};

解題思路:

這一道題,我的思路是用雙指針暴力求解,

但這個數(shù)組長度,O(N^2)的時間復(fù)雜度肯定是不可能把所有樣例跑完,

看了大佬的思路,用的是歸并排序,(如果不會歸并排序,最好先去學(xué)一下)

我一開始看了很久沒有搞明白為什么,

實際上,這個思路是利用的歸并排序的一個特性,具體思路如下:

例: 數(shù)組 [ 7, 5, 2, 6, 0, 1, 5, 4 ]

我們就拿這個數(shù)組歸并到最后一步的時候作為樣例:

[ 2, 5, 6, 7 ] 和?[ 0, 1, 4, 5 ]

由于他們通過先前的歸并已經(jīng)是兩個有序的數(shù)組,

而最后一步就兩個數(shù)組每個元素比大小,然后尾插到臨時數(shù)組上,最后再拷貝回來,

重點來了:

第一個數(shù)比大小 2 > 0 所以尾插 0 并讓第二個數(shù)組的下標(biāo)begin2++,

因為這兩個是升序數(shù)組,2 > 0,也表明 2 之后的所有數(shù)都大于 0 ,

那么這里就有 4 ( mid + 1,也就是第一個數(shù)組的長度) 個逆序數(shù)對,

那么,當(dāng) 2 和 4 比較,2 < 4 ,就尾插 2 進臨時數(shù)組,讓第一個數(shù)組下標(biāo)begin1++,

這個時候,繼續(xù)往下比較,5 > 4,?尾插 4?并讓第二個數(shù)組的下標(biāo)begin2++,

因為這兩個是升序數(shù)組,5?> 4,也表明 5?之后的所有數(shù)都大于 4,

但是因為第一個數(shù)組已經(jīng)是第二個數(shù)了,所以:

這里就有 3 ( mid + 1 - begin1?(也就是減去第一個數(shù)組的下標(biāo)))個逆序數(shù)對。

綜上所述,

我們只需要在第一個數(shù)組的值 > 第二個數(shù)組的值的時候,記錄逆序數(shù)對?(mid + 1 - begin1) 即可。

下面是代碼:

代碼:

class Solution {
public:
    //計數(shù)
    int res = 0;
    int reversePairs(vector<int>& nums) {
        //創(chuàng)建臨時數(shù)組
        vector<int> tmp(nums.size());
        //歸并排序,我用的是我學(xué)的歸并排序模板
        merge_sort(nums, tmp, 0, nums.size() - 1);
        return res;
    }
private:
    void merge_sort(vector<int>& nums, vector<int>& tmp, int begin, int end) {
        if(begin >= end) return; //返回

        //分治
        int mid = (begin + end) >> 1;
        merge_sort(nums, tmp, begin, mid);
        merge_sort(nums, tmp, mid + 1, end);
        //[begin][mid], [mid + 1][end]

        //兩個數(shù)組的下標(biāo)
        int begin1 = begin, end1 = mid;
        int begin2 = mid + 1, end2 = end;

        //臨時數(shù)組的下標(biāo)
        int i = begin;

        //比較大小之后尾插進臨時數(shù)組
        while(begin1 <= end1 && begin2 <= end2) {
            if(nums[begin1] <= nums[begin2]) {
                tmp[i++] = nums[begin1++];
            }
            else {
                tmp[i++] = nums[begin2++];
                //計算這一段的逆序數(shù)對數(shù)量//具體推導(dǎo)看文章的文字
                res += mid + 1 - begin1; //整個思路的核心
            }
        }

        //將沒有插完的值全部尾插進臨時數(shù)組
        while(begin1 <= end1) tmp[i++] = nums[begin1++];
        while(begin2 <= end2) tmp[i++] = nums[begin2++];

        //將臨時數(shù)組拷貝回原數(shù)組
        for(int i = begin; i <= end; i++) {
            nums[i] = tmp[i];
        }
    }
};

過啦?。?!

【LeetCode】劍指 Offer(26)?

寫在最后:

以上就是本篇文章的內(nèi)容了,感謝你的閱讀。

如果喜歡本文的話,歡迎點贊和評論,寫下你的見解。

如果想和我一起學(xué)習(xí)編程,不妨點個關(guān)注,我們一起學(xué)習(xí),一同成長。

之后我還會輸出更多高質(zhì)量內(nèi)容,歡迎收看文章來源地址http://www.zghlxwxcb.cn/news/detail-410426.html

到了這里,關(guān)于【LeetCode】劍指 Offer(26)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

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

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

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

    2024年02月16日
    瀏覽(20)
  • Leetcode-每日一題【劍指 Offer 11. 旋轉(zhuǎn)數(shù)組的最小數(shù)字】

    Leetcode-每日一題【劍指 Offer 11. 旋轉(zhuǎn)數(shù)組的最小數(shù)字】

    把一個數(shù)組最開始的若干個元素搬到數(shù)組的末尾,我們稱之為數(shù)組的旋轉(zhuǎn)。 給你一個可能存在?重復(fù)?元素值的數(shù)組?numbers?,它原來是一個升序排列的數(shù)組,并按上述情形進行了一次旋轉(zhuǎn)。請返回旋轉(zhuǎn)數(shù)組的最小元素。例如,數(shù)組?[3,4,5,1,2] 為 [1,2,3,4,5] 的一次旋轉(zhuǎn),該數(shù)組的

    2024年02月14日
    瀏覽(21)
  • (排序) 劍指 Offer 45. 把數(shù)組排成最小的數(shù) ——【Leetcode每日一題】

    (排序) 劍指 Offer 45. 把數(shù)組排成最小的數(shù) ——【Leetcode每日一題】

    難度:中等 輸入一個非負(fù)整數(shù)數(shù)組,把數(shù)組里所有數(shù)字拼接起來排成一個數(shù),打印能拼接出的所有數(shù)字中最小的一個。 示例 1: 輸入: [10,2] 輸出: “102” 示例 2: 輸入: [3,30,34,5,9] 輸出: “3033459” 提示 : 0 nums.length = 100 說明: 輸出結(jié)果可能非常大,所以你需要返回一個字符串而不

    2024年02月10日
    瀏覽(18)
  • (排序) 劍指 Offer 51. 數(shù)組中的逆序?qū)?——【Leetcode每日一題】

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

    難度:困難 在數(shù)組中的兩個數(shù)字,如果前面一個數(shù)字大于后面的數(shù)字,則這兩個數(shù)字組成一個逆序?qū)?。輸入一個數(shù)組,求出這個數(shù)組中的逆序?qū)Φ目倲?shù)。 示例 1: 輸入: [7,5,6,4] 輸出: 5 限制 : 0 = 數(shù)組長度 = 50000 ??思路:歸并排序 預(yù)備知識 「 歸并排序 」是用 分治 思想,分

    2024年02月11日
    瀏覽(24)
  • 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ù)組的和的最大值。 要求時間復(fù)雜度為 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 21. 調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)前面 ——【Leetcode每日一題】

    (排序) 劍指 Offer 21. 調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)前面 ——【Leetcode每日一題】

    難度:簡單 輸入一個整數(shù)數(shù)組,實現(xiàn)一個函數(shù)來調(diào)整該數(shù)組中數(shù)字的順序,使得所有奇數(shù)在數(shù)組的前半部分,所有偶數(shù)在數(shù)組的后半部分。 示例: 輸入:nums = [1,2,3,4] 輸出:[1,3,2,4] 注:[3,1,2,4] 也是正確的答案之一。 提示 : 0 = n u m s . l e n g t h = 50000 0 = nums.length = 50000 0 =

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

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

    統(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)
  • 劍指 Offer 66. 構(gòu)建乘積數(shù)組

    給定一個數(shù)組 A[0,1,…,n-1] ,請構(gòu)建一個數(shù)組 B[0,1,…,n-1] ,其中 B[i] 的值是數(shù)組 A 中除了下標(biāo) i 以外的元素的積, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1] 。不能使用除法。 示例: 提示: 所有元素乘積之和不會溢出 32 位整數(shù) a.length = 100000 解答

    2024年02月16日
    瀏覽(26)
  • 【劍指offer】數(shù)據(jù)結(jié)構(gòu)——數(shù)組

    【劍指offer】數(shù)據(jù)結(jié)構(gòu)——數(shù)組

    【劍指offer】03.數(shù)組中重復(fù)的數(shù)字 //03. 數(shù)組中重復(fù)的數(shù)字 // 找出數(shù)組中重復(fù)的數(shù)字。 // 力扣 // 在一個長度為 n 的數(shù)組 nums 里的所有數(shù)字都在 0~n-1 的范圍內(nèi)。 // 數(shù)組中某些數(shù)字是重復(fù)的,但不知道有幾個數(shù)字重復(fù)了,也不知道每 // 個數(shù)字重復(fù)了幾次。請找出數(shù)組中任意一

    2024年02月08日
    瀏覽(14)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包