❓769. 最多能完成排序的块
难度:中等
给定一个长度为 n
的整数数组 arr
,它表示在 [0, n - 1]
范围内的整数的排列。
我们将 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] 可以得到最多的块数。
对每个块单独排序后,结果为 [0, 1], [2], [3], [4]
提示:
- n == arr.length
- 1 <= n <= 10
- 0 <= arr[i] < n
arr
中每个元素都 不同
💡思路:贪心
要想每个块的连接的结果和升序排序后的原数组相同,则必须保证每个块里面的数,就是其数组下标范围内的数据,这样连接的结果才是升序的;
- 遍历数组过程中就是找每个块里面的最大数
tmp
; - 遍历到数组下标为最大数
tmp
的位置,数组里面一个块里面的数,都在其对应的数组下标范围内,这这些数即为一个块,ans++
; - 然后进入下一个块;
🍁代码:(Java、C++)
Java
class Solution {
public int maxChunksToSorted(int[] arr) {
int ans = 0;
int tmp = arr[0];
for(int i = 0; i < arr.length; i++){
if(arr[i] > tmp) tmp = arr[i];
if(i == tmp) ans++;
}
return ans;
}
}
C++
class Solution {
public:
int maxChunksToSorted(vector<int>& arr) {
int ans = 0;
int tmp = arr[0];
for(int i = 0; i < arr.size(); i++){
if(arr[i] > tmp) tmp = arr[i];
if(i == tmp) ans++;
}
return ans;
}
};
🚀 运行结果:
🕔 复杂度分析:
- 时间复杂度:
O
(
n
)
O(n)
O(n),其中
n
为数组arr
的长度。 - 空间复杂度: O ( 1 ) O(1) O(1),只需常量级空间。
题目来源:力扣。
放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!