持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
本来已经是周六了,毕竟已经上了6天班了,怎么才周四啊
最多能完成排序的块
该题出自力扣的769题 —— 最多能完成排序的块【中等题】
审题
给定一个长度为 n 的整数数组 arr ,它表示在 [0, n - 1] 范围内的整数的排列。 我们将 arr 分割成若干 块 (即分区),并对每个块单独排序。将它们连接起来后,使得连接的结果和按升序排序后的原数组相同。 返回数组能分成的最多块数量。
- 这道题虽然是中等题,但是题意并不复杂,就是给出一个整型数组,按照块分配数量,返回最大可分配的数量,但是前提是最终分配的快,排序之后要跟数组的原升序一致
- 一开始是想用数组解法的,也就是开辟一个数组,然后用数组记录原数组对应下标值的原下标,但是确实是会遗漏一些边界细节
- 那么后续又想用暴力实现,暴力就很简单了,直接遍历0到n,在内部再寻找当前下标所对应的原数组,极端情况下是O(n²)的时间复杂度
- 最后使用的是遍历数组,寻找最大值,如果当前下标的最大值与变量作比较,如果最大值等于当前下标,也就是值,那么就证明一定是最大值,当遍历到第i个位置时,如果可以切分为块,那前i个位置的最大值一定等于i。否则,一定有比i小的数划分到后面的块,那块排序后,一定不满足升序。
编码
class Solution {
public int maxChunksToSorted(int[] arr) {
int len = arr.length;
int num = 0;
int max = 0;
for (int i = 0; i < len;i++) {
max = Math.max(arr[i],max);
if (max == i)num++;
}
return num;
}
}