這個問題和「最多能完成排序的塊」類似,但給定數組中的元素能夠重複,輸入數組最大長度爲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; } }
這個問題和「最多能完成排序的塊」類似,但給定數組中的元素能夠重複,輸入數組最大長度爲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; } }