算法-单调栈(java)

套路:

    /**
     * 单调栈套路:
     *      new Stack
     *      for(遍历处理集){
     *          while(栈非空 && 达到预期条件){
     *              出栈并处理,保存到结果集
     *          }
     *          入栈(栈中保存数组的索引)
     *      }
     *      while(栈非空){
     *          出栈处理剩余栈内元素
     *      }
     * */

leetcode 739. 每日温度

算法-单调栈(java)_第1张图片

解题

// 单调栈,栈空或不满足预期条件(即出现大的温度)的入栈,满足的出栈处理,即构建单调减栈
    public int[] dailyTemperatures(int[] T){
        int[] ans = new int[T.length];
        Stack<Integer> stack = new Stack<>();
        // 遍历
        for (int i = 0; i < T.length; i++) {
            // 当栈非空且达到预期条件,则出栈处理,使用while循环判断,直到没达到预期条件入栈
            while(!stack.isEmpty() && T[i]>T[stack.peek()]){
                ans[stack.peek()] = i - stack.pop();
            }
            // 栈空或不满足预期条件的入栈
            stack.push(i);
        }
        return ans;
    }

leetcode 496. 下一个更大元素 I

算法-单调栈(java)_第2张图片

解题

/**
     * 我们可以忽略数组 nums1,先对将 nums2 中的每一个元素,求出其下一个更大的元素。
     * 随后对于将这些答案放入哈希映射(HashMap)中,再遍历数组 nums1,并直接找出答案。
     * 对于 nums2,我们可以使用单调栈来解决这个问题。
     * */
    public int[] nextGreaterElement(int[] nums1, int[] nums2){
        HashMap<Integer, Integer> map = new HashMap<>();
        Stack<Integer> stack = new Stack<>();
        int[] ans = new int[nums1.length];
        for (int i = 0; i < nums2.length; i++) {
            while(!stack.isEmpty() && stack.peek()<nums2[i]){
                map.put(stack.pop(),nums2[i]);
            }
            stack.push(nums2[i]);
        }
        while (!stack.isEmpty()){
            map.put(stack.pop(),-1);
        }
        for (int i = 0; i < nums1.length; i++) {
            ans[i] = map.get(nums1[i]);
        }
        return ans;
    }

leetcode 503. 下一个更大元素 II

算法-单调栈(java)_第3张图片

解题

public int[] nextGreaterElements(int[] nums) {
        int length = nums.length;
        int[] ans = new int[length*2];
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < length*2; i++) {
            while (!stack.isEmpty() && nums[stack.peek()%length]<nums[i%length]){
                ans[stack.pop()] = nums[i%length];
            }
            stack.push(i);
        }
        while (!stack.isEmpty()){
            ans[stack.pop()] = -1;
        }
        return Arrays.copyOf(ans,length);
    }

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