leetcode 1124. 表现良好的最长时间段 题解

给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。

我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。

所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。

请你返回「表现良好时间段」的最大长度。

 

示例 1:

输入:hours = [9,9,6,0,6,6,9]
输出:3
解释:最长的表现良好时间段是 [9,9,6]。

一、前缀和思想

这个类题目可以用前缀和思想,就是把大于九的位等于1,小于九的置位-1,那么前n位的和表示前n为大于9和小于9的差值,题目的意思是希望这个和大于0的,那么可以使用滑动窗口思想,固定左边移动右边游标,取他们之间的累加之差就是左边和右边游标之间的大于9和小于9的差值。代码如下

#define max(x,y) ( x>y?x:y )

int longestWPI(int* hours, int hoursSize){
	int i=0;
	int mx=0;
	int left=0;
	int right=0;
	if(hoursSize==0) return -1;
	int *count=(int *)malloc(sizeof(int)*(hoursSize+1));
	count[0]=0;
	//if(hours[0]>8) count[0]=1;
	for(int i=0;i<hoursSize;i++){
		if(hours[i]>8)
			count[i+1]=count[i]+1;
		else
			count[i+1]=count[i]-1;
	}
	for(left=0;left<hoursSize-mx;left++){
		for(right=left+1;right<=hoursSize;right++){
			if((count[right]-count[left])>0){
				mx=max(right-left,mx);
			}
		}
	}
	return mx;
}

二、单调栈思想

这思想就是利用栈,将栈顶的前缀和索引对于的前缀和值和当前值比较,如果当前值小,则入栈,表示此时栈top对应前缀和值恰巧满足「劳累的天数」是严格 大于「不劳累的天数」,然后继续执行,直到前缀和索引尾部,此时取栈顶数据,逆序取从前缀和数值与栈顶比较,得到差值为题目要求的一个解,并比较这些解中最大值,得到输出

class Solution {
public:
    int longestWPI(vector<int>& hours) {
        int n = hours.size();
        int res = 0;
        vector<int> sum(n + 1, 0);
        stack<int> sta;
        sta.push(0);
        for (int i = 0; i < n; ++i) {
            sum[i + 1] = sum[i] + (hours[i] > 8 ? 1 : -1);
            if (sum[i + 1] < sum[sta.top()]) {
                sta.push(i + 1);
            }
        }

        for (; n > res; --n) {
            while (!sta.empty() && sum[n] > sum[sta.top()]) {
                res = max(res, n - sta.top());
                sta.pop();
            }
        }
        return res;
    }
};


参考作者:dpapa
链接:https://leetcode-cn.com/problems/longest-well-performing-interval/solution/c-qian-zhui-he-dan-diao-zhan-by-dpapa/
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值