难度:中等
题目:
给你一份工作时间表
hours
,上面记录着某一位员工每天的工作小时数。我们认为当员工一天中的工作小时数大于
8
小时的时候,那么这一天就是「劳累的一天」。所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。
请你返回「表现良好时间段」的最大长度。
示例 1:
输入:hours = [9,9,6,0,6,6,9] 输出:3 解释:最长的表现良好时间段是 [9,9,6]。
示例 2:
输入:hours = [6,6,6] 输出:0
提示:
1 <= hours.length <= 104
0 <= hours[i] <= 16
Related Topics
- 栈
- 数组
- 哈希表
- 前缀和
- 单调栈
重点!!!解题思路
第一步:
这道题需要使用一个思想就是一个 前缀和的概念,
如果有不了解的朋友也可以接着往下看:
你可以先把原来给的数组变成一个别的数组
原数组【9,9,6,0,6,6,9】 大于8是1,小于8是-1
现在数组:【1,1,-1,-1,-1,-1,1】
前缀和数组【1,2,1,0,-1,-2,-1】
第二步:
清楚了上述步骤,就可以接着往下来了
当这个前缀和数组的值大于0,那么它就是一个劳累的一天,
一串大于0的数连在一起,加起来那就是劳累的时间段
第三步:
但是想到这里还不行,因为大于0确实是一个良好的表现,要是小于0呢?
比如前缀和【1,0,-1,-2,-1,0,1】这个情况请见如下代码!!!
代码+讲解:
class Solution {
public int longestWPI(int[] hours) {
Map<Integer,Integer> map = new HashMap<>();
int cur=0;
int res=0;
for (int i=0;i<hours.length;i++){
if (hours[i]>8){
cur++;
}else {
cur--;
}
if (cur>0){
res=i+1; //大于0那么肯定是下标i+1,因为前缀和中都是连续的
}else{
if (!map.containsKey(cur)) map.put(cur,i); //前缀和是<0进来 添加到map中
if (map.containsKey(cur-1)) //要是存在一个前缀和-1的数,相当于【-1,-2,-1,0,1】 访问到0时,查到了前面的-1,因为有负数到正,肯定是一个对称的,这时cur-1就拿到了上升区间的前驱节点
res=Math.max(res,i-map.get(cur-1)); //看看哪个区间大一点
}
}
return res; //返回区间大小
}
}
运行结果:
如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。
系列持续更新中,点个订阅吧