962.最大宽度

题目:

给定一个整数数组 A,坡是元组 (i, j),其中  i < j 且 A[i] <= A[j]。这样的坡的宽度为 j - i。
找出 A 中的坡的最大宽度,如果不存在,返回 0 。
 1 class Solution {
 2    public int maxWidthRamp(int[] A) {
 3     Deque<Integer> stack=new ArrayDeque<>();
 4     int res=0;
 5     for(int i=0;i<A.length;i++){
 6         if(stack.isEmpty() || A[stack.peek()]>A[i]){
 7             stack.push(i);
 8         }
 9     }
10     for(int i=A.length-1;i>=0;i--){
11         while(!stack.isEmpty() && A[stack.peek()]<=A[i]){
12             int cur=stack.pop();
13             res=Math.max(res,i-cur);
14         }
15     }
16     return res;
17 }
18 
19 
20 }

1124.表现良好的时间段

题目:

给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。
我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。
所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。
请你返回「表现良好时间段」的最大长度。
 
 
 
分析:这里的题意可以转化成上题,即
给定一个整数数组 A,连续每天干活时长是元组 (i, j),其中  i < j 且 A[i] < A[j]。这样表现良好的时间段为j -i,
找出 A 中表现良好的时间段,如果不存在,返回 0 。
 
class Solution {
    public int longestWPI(int[] A) {
   Deque<Integer> stack=new ArrayDeque<>();
    int res=0;

    for(int i = 0; i < A.length; i ++){
        A[i] = A[i] > 8 ?  1:-1;
    }
    int[] preSum = new int[A.length+1];
    preSum[0] = 0;
    for(int i = 1; i <= A.length; i ++){
        preSum[i] = preSum[i-1]+A[i-1];
    }
    for(int i=0;i<preSum.length;i++){
        if(stack.isEmpty() || preSum[stack.peek()]>preSum[i]){
            stack.push(i);
        }
    }
    for(int i=preSum.length-1;i>=0;i--){
        while(!stack.isEmpty() && preSum[stack.peek()]<preSum[i]){
            int cur=stack.pop();
            res=Math.max(res,i-cur);
        }
    }
    return res;
       

    }
}

 

 
 
 
posted on 2020-06-01 00:18  Moonshoterr  阅读(182)  评论(0编辑  收藏  举报