知识点

双端队列,单调维护

解题思路

某个元素B要成为之前元素A的首个大于的数,条件就需要在元素B之前没有比他大的数来阻止他成为A首个大的数。

因此我们可以从后往前遍历数组,维护一个存放元素下标的双端队列,当遍历到的这个元素大于队列中的元素,相当于当前元素就能阻挡后面比他小的元素,所以需要剔除队列中比他小的元素,这样下来对列中的元素就是单调递增的,而ans[i]就是对列中下一个元素 - 当前i。如果队列中此时没有元素,说明后面没有比当前元素大的的了。

Java题解

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param weights int整型一维数组 
     * @return int整型一维数组
     */
    public int[] weightGrowth (int[] weights) {
        // write code here
        Deque<Integer> deque = new LinkedList<>();
        int n = weights.length;
        int[] ans = new int[n];
        for (int i = n - 1; i >= 0; i--){
            while(!deque.isEmpty() && weights[i] >= weights[deque.getFirst()]){
                deque.pollFirst();
            }
            if(deque.isEmpty()){
                ans[i] = -1;
            } else {
                ans[i] = deque.getFirst() - i;
            }
            deque.offerFirst(i);
        }
        return ans;
    }
}