LeetCode——769.最多能完成排序的块

通过万岁!!!

  • 题目:给你一个数组,数组的值是0到n-1,数组长度是n。然后你可以对数组进行拆分,要求拆分后进行内部排序,然后拼凑起来以后,结果跟直接对数组进行排序的结果一样。换句话说,对数组进行拆分成k,然后k块内部排序以后,还是按照1-k拼接,的结果和直接对数组排序的结果一样。
  • 思路:其实这个题有两个关键,第一个就是数组的特殊性,数组是从0到n-1的。第二个就是找区域,从l到r,然后从l到r对数组进行排序以后,刚好是l,l+1,…,r。找到的这个区域,就可以分成一个块。还需要注意的是,找块的过程一定是按照顺序的,从左到右。上面的话,有些啰嗦,我简化一下“就是l到r中的r-l+1个元素的值在l到r之间(这里的l到r是闭区间)”。
  • 技巧:数组遍历

java代码

class Solution {
    public int maxChunksToSorted(int[] arr) {
        // 保证从l到r排序以后,元素还是在l到r这一块,也就是l到r的元素的值在l到r之间。因为数组的值是0到n-1
        int r = arr[0];
        int ans = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] <= r && r == i) {// 前面的判断保证值是正确的,后面的r==i保证区间的大小
                ans++;
                r = i + 1;
            } else {
                r = Math.max(r, arr[i]);
            }
        }
        return ans;
    }
}
  • 总结:题目思路有点绕。其实就是我总结的那句话,只要理解了,就比较简单了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值