Java實現 LeetCode 768 最多能完成排序的塊 II(左右便利)

768. 最多能完成排序的塊 II

這個問題和「最多能完成排序的塊」類似,但給定數組中的元素能夠重複,輸入數組最大長度爲2000,其中的元素最大爲10**8。java

arr是一個可能包含重複元素的整數數組,咱們將這個數組分割成幾個「塊」,並將這些塊分別進行排序。以後再鏈接起來,使得鏈接的結果和按升序排序後的原數組相同。數組

咱們最多能將數組分紅多少塊?ide

示例 1:spa

輸入: arr = [5,4,3,2,1]
輸出: 1
解釋:
將數組分紅2塊或者更多塊,都沒法獲得所需的結果。
例如,分紅 [5, 4], [3, 2, 1] 的結果是 [4, 5, 1, 2, 3],這不是有序的數組。
示例 2:code

輸入: arr = [2,1,3,4,4]
輸出: 4
解釋:
咱們能夠把它分紅兩塊,例如 [2, 1], [3, 4, 4]。
然而,分紅 [2, 1], [3], [4], [4] 能夠獲得最多的塊數。
注意:排序

arr的長度在[1, 2000]之間。
arr[i]的大小在[0, 10**8]之間。it

PS:
從右向左找最小的,用一個數組記錄一下,
而後在從左向右找,只要當前最大的比後面最小的小,就須要新建一個組io

class Solution {
   public int maxChunksToSorted(int[] arr) {
        if (arr.length == 0) return 0;
        int[] MIN = new int[arr.length];
        for (int i = arr.length - 1, min = arr[arr.length - 1]; i >= 0; i--) {
            if (arr[i] < min) min = arr[i];
            MIN[i] = min;
        }

        int res = 1;
        for (int i = 0, max = arr[0]; i < arr.length - 1; i++) {
            if (max < arr[i]) max = arr[i];
            if (max <= MIN[i + 1]) res++;
        }
        return res;
    }
}

768. 最多能完成排序的塊 II

這個問題和「最多能完成排序的塊」類似,但給定數組中的元素能夠重複,輸入數組最大長度爲2000,其中的元素最大爲10**8。class

arr是一個可能包含重複元素的整數數組,咱們將這個數組分割成幾個「塊」,並將這些塊分別進行排序。以後再鏈接起來,使得鏈接的結果和按升序排序後的原數組相同。di

咱們最多能將數組分紅多少塊?

示例 1:

輸入: arr = [5,4,3,2,1]
輸出: 1
解釋:
將數組分紅2塊或者更多塊,都沒法獲得所需的結果。
例如,分紅 [5, 4], [3, 2, 1] 的結果是 [4, 5, 1, 2, 3],這不是有序的數組。
示例 2:

輸入: arr = [2,1,3,4,4]
輸出: 4
解釋:
咱們能夠把它分紅兩塊,例如 [2, 1], [3, 4, 4]。
然而,分紅 [2, 1], [3], [4], [4] 能夠獲得最多的塊數。
注意:

arr的長度在[1, 2000]之間。
arr[i]的大小在[0, 10**8]之間。

PS:
從右向左找最小的,用一個數組記錄一下,
而後在從左向右找,只要當前最大的比後面最小的小,就須要新建一個組

class Solution {
   public int maxChunksToSorted(int[] arr) {
        if (arr.length == 0) return 0;
        int[] MIN = new int[arr.length];
        for (int i = arr.length - 1, min = arr[arr.length - 1]; i >= 0; i--) {
            if (arr[i] < min) min = arr[i];
            MIN[i] = min;
        }

        int res = 1;
        for (int i = 0, max = arr[0]; i < arr.length - 1; i++) {
            if (max < arr[i]) max = arr[i];
            if (max <= MIN[i + 1]) res++;
        }
        return res;
    }
}
相關文章
相關標籤/搜索