題目描述
這是 LeetCode 上的 769. 最多能完成排序的塊 ,難度為 中等。
Tag : 「模拟」
給定一個長度為
n
的整數數組
arr
,它表示在
我們将
arr
分割成若幹 塊 (即分區),并對每個塊單獨排序。将它們連接配接起來後,使得連接配接的結果和按升序排序後的原數組相同。
傳回數組能分成的最多塊數量。
示例 1:
輸入: arr = [4,3,2,1,0]
輸出: 1
解釋:
将數組分成2塊或者更多塊,都無法得到所需的結果。
例如,分成 [4, 3], [2, 1, 0] 的結果是 [3, 4, 0, 1, 2],這不是有序的數組。
示例 2:
輸入: arr = [1,0,2,3,4]
輸出: 4
解釋:
我們可以把它分成兩塊,例如 [1, 0], [2, 3, 4]。
然而,分成 [1, 0], [2], [3], [4]
提示:
-
中每個元素都 不同arr
模拟
本題考察的是簡單模拟能力,或者說是簡單的對「循環不變量」的設計。
我們從前往後處理所有的 (即
i
定義為目前劃分塊的右邊界下标),處理過程中定義變量
j
為目前劃分塊的左邊界下标(初始值為 ),定義
min
為目前劃分塊中元素最小值(初始值為 或 ),定義
max
為目前劃分塊中元素最大值(初始值為 或 )。
當且僅當 且 時,下标範圍 排序結果為 ,此時塊的個數加一,并重新初始化幾個變量,繼續循環統計下個塊的資訊。
Java 代碼:
class Solution {
public int maxChunksToSorted(int[] arr) {
int n = arr.length, ans = 0;
for (int i = 0, j = 0, min = n, max = -1; i < n; i++) {
min = Math.min(min, arr[i]);
max = Math.max(max, arr[i]);
if (j == min && i == max) {
ans++; j = i + 1; min = n; max = -1;
}
}
return
TypeScript 代碼:
function maxChunksToSorted(arr: number[]): number {
let n = arr.length, ans = 0
for (let i = 0, j = 0, min = n, max = -1; i < n; i++) {
min = Math.min(min, arr[i])
max = Math.max(max, arr[i])
if (j == min && i == max) {
ans++; j = i + 1; min = n; max = -1;
}
}
return
Python 代碼:
class Solution:
def maxChunksToSorted(self, arr: List[int]) -> int:
n, ans = len(arr), 0
j, minv, maxv = 0, n, -1
for i in range(n):
minv, maxv = min(minv, arr[i]), max(maxv, arr[i])
if j == minv and i == maxv:
ans, j, minv, maxv = ans + 1, i + 1, n, -1
return
- 時間複雜度:
- 空間複雜度:
最後
這是我們「刷穿 LeetCode」系列文章的第
No.769
篇,系列開始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道題目,部分是有鎖題,我們将先把所有不帶鎖的題目刷完。
在這個系列文章裡面,除了講解解題思路以外,還會盡可能給出最為簡潔的代碼。如果涉及通解還會相應的代碼模闆。