中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++實現可排序的最大塊數的方法

發布時間:2021-07-13 10:37:50 來源:億速云 閱讀:130 作者:chen 欄目:開發技術

這篇文章主要介紹“C++實現可排序的最大塊數的方法”,在日常操作中,相信很多人在C++實現可排序的最大塊數的方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++實現可排序的最大塊數的方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

[LeetCode] 769.Max Chunks To Make Sorted 可排序的最大塊數

Given an array arr that is a permutation of [0, 1, ..., arr.length - 1], we split the array into some number of "chunks" (partitions), and individually sort each chunk.  After concatenating them, the result equals the sorted array.

What is the most number of chunks we could have made?

Example 1:

Input: arr = [4,3,2,1,0]
Output: 1
Explanation:
Splitting into two or more chunks will not return the required result.
For example, splitting into [4, 3], [2, 1, 0] will result in [3, 4, 0, 1, 2], which isn't sorted.

Example 2:

Input: arr = [1,0,2,3,4]
Output: 4
Explanation:
We can split into two chunks, such as [1, 0], [2, 3, 4].
However, splitting into [1, 0], [2], [3], [4] is the highest number of chunks possible.

Note:

  • arr will have length in range [1, 10].

  • arr[i] will be a permutation of [0, 1, ..., arr.length - 1].

這道題給了我們一個長度為n的數組,里面的數字是[0, n-1]范圍內的所有數字,無序的。現在讓我們分成若干塊兒,然后給每一小塊兒分別排序,再組合到一起,使原數組變得有序,問我們最多能分多少塊,題目中的兩個例子很好的解釋了題意。我們首先來分析例子1,這是一個倒序的數組,第一個數字是最大的,為4,那么我們想,這個數字4原本是應該位于數組的最后一個位置,所以中間不可能斷開成新的塊了,要不然數字4就沒法跑到末尾去了。分析到這里,我們應該隱約有點感覺了,當前數字所在的塊至少要到達坐標為當前數字大小的地方,比如數字4所在的塊至少要包括i=4的那個位置。那么帶著這個發現,來分析例子2。第一個數字是1,那么當前數字1所在的塊至少要到 i=1 的位置,然后我們去 i=1 的位置上看,發現是數字0,并沒有超過 i=1 的范圍,那么前兩個數就可以斷開成一個新的塊兒。再往后看,i=2 的位置是2,可以單獨斷開,后面的3和4也可以分別斷開。所以其實這道題跟Jump Game II那題很像,我們需要維護一個最遠能到達的位置,這里的每個數字相當于那道題中的跳力,只有當我們剛好到達最遠點的時候,就可以把之前斷成一個新的塊兒了。

我們遍歷原數組,用cur表示能到達的最遠點,然后我們遍歷當前位置到cur之間的所有點,遍歷的同時如果遇到更大的數字就更新cur,當cur大于等于末尾數字的時候,此時不能再拆分新塊兒了,返回結果res加1。否則的話說明到達了最遠點,更新第一個for循環的變量i,并且結果res自增1。來看個例子:

[2 0 1 4 3]

當 i=0 時,cur=2,j=1,然后我們發現 j=1 和 j=2 的數字都不會更新cur,且cur也沒有大于等于3,所以此時 j=3 的時候退出了內部的for循環,i賦值為2,結果res為1。然后此時 i=3,cur=4,4已經大于末尾的3了,直接返回res加1,即2,參見代碼如下:

解法一:

class Solution {
public:
    int maxChunksToSorted(vector<int>& arr) {
        int res = 0, n = arr.size();
        for (int i = 0; i < n; ++i) {
            int cur = arr[i], j = i + 1;
            for (; j <= cur; ++j) {
                cur = max(cur, arr[j]);
                if (cur >= arr.back()) return res + 1;
            }
            i = j - 1;
            ++res;
        }
        return res;
    }
};

其實這道題有更霸道的解法,我們仔細觀察一些例子,可以發現斷開為新塊兒的地方都是當之前出現的最大值正好和當前位置坐標相等的地方,比如例子2中,當 i=1 時,之前最大的數字是1,所以可以斷開。而在例子1中,當 i=4 時,才和之前出現過的最大數字4相等,此時斷開也沒啥意義了,因為后面已經沒有數字了,所以還只是一個塊兒,參見代碼如下: 

解法二:

class Solution {
public:
    int maxChunksToSorted(vector<int>& arr) {
        int res = 0, n = arr.size(), mx = 0;
        for (int i = 0; i < n; ++i) {
            mx = max(mx, arr[i]);
            if (mx == i) ++res;
        }
        return res;
    }
};

到此,關于“C++實現可排序的最大塊數的方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

汾西县| 孝昌县| 安徽省| 古蔺县| 瓮安县| 晴隆县| 马鞍山市| 望都县| 黄平县| 东至县| 长海县| 赞皇县| 柳州市| 且末县| 扬中市| 洞口县| 五莲县| 始兴县| 盐边县| 潼南县| 麻城市| 太和县| 龙口市| 兴安县| 闽清县| 海淀区| 金昌市| 岱山县| 高阳县| 荔浦县| 黄浦区| 石泉县| 获嘉县| 交口县| 凭祥市| 赣榆县| 金阳县| 津南区| 义马市| 红原县| 望都县|