768. 最多能完成排序的块 II(单调栈)

768. 最多能完成排序的块 II(单调栈)_第1张图片
题目的意思是将原数组分成n块后,对每一块分别排序,排完序后再按原来的顺序组合起来,要求组合后的数组与原数组排序后的结果相同

单调栈的做法
当一个数组被分成n块后,如果再从尾部加入一个数,则有两种情况。
第一种是加入的数大于等于最后一块的最大值,那么它可以单独成为一块,不会对原来的分块有影响。
第二种是加入的数小于最后一块的最大值,那么首先它要和最后一块合并,并且此时最后一块的最小值如果被它影响导致其小于倒数第二块的最大值,那么此时最后一块和倒数第二块也要合并,以此类推。
简单的来讲,如果加入的数很小,很弱,那么它就会拖累被它加入的块,导致该块需要和前一块融合,知道融合得到新块的最小值大于等于前一块的最大值。

class Solution {
    public int maxChunksToSorted(int[] arr) {
        Deque<Integer> dq = new LinkedList<>();
        dq.addLast(arr[0]);
        for(int i = 1; i < arr.length; i++){
            int t = dq.getLast();
            while(dq.size() > 0 && arr[i] < dq.getLast()) 
                dq.removeLast();
            dq.addLast(Math.max(t, arr[i]));
        }
        return dq.size();
    }
}

前缀和的做法
对于第i个数 当且仅当i和它前面所有数的最大值 小于 i后面所有数的最小值时 可以把i和它前面的数分出去 结果 + 1

你可能感兴趣的:(算法,leetcode)