前言
跟昨天一样,今天的LeetCode每日一题132. 分割回文串 II我自己还在研究,就先不拿出来献丑了,先用随机题来写(如果随机到困难题的话,就再随机一次😄)。
题目描述
给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。
我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。
所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。
请你返回「表现良好时间段」的最大长度。
示例 1:
输入:hours = [9,9,6,0,6,6,9]
输出:3
解释:最长的表现良好时间段是 [9,9,6]。
提示:
- 1 <= hours.length <= 10000
- 0 <= hours[i] <= 16
解题思路
给定一个数组hours,求数组内符合条件的最大长度子数组,是不是跟之前写的几篇题解差不多了,那我们就用之前已经练过的前缀和来解决这道题吧!
既然是用前缀和来解答,那么先定义一个给定数组hours的长度+1的前缀和数组pre_sum,这里长度+1是为了和前一天做比较,然后pre_sum的每一项预先填充为0。
循环hours数组,判断数组中的每一项和8的大小,>8就等于前缀和数组中前一项+1,反之则-1。
得到前缀和数组pre_sum,要先满足表示良好时间段,即pre_sum数组中两个元素的差>0。
要求最大长度,即满足pre_sum数组中两个元素差>0的最大值即可。
解题代码
/**
* @param {number[]} hours
* @return {number}
*/
var longestWPI = function(hours) {
const n = hours.length;
let pre_sum = new Array(n + 1).fill(0)
for (let i = 1; i <= n; i++) {
if (hours[i-1] > 8) {
pre_sum[i] = pre_sum[i - 1] + 1
} else {
pre_sum[i] = pre_sum[i - 1] - 1
}
}
let res = 0
const m = pre_sum.length;
for (let i = 0; i< m-1; i++){
for (let j =i+1; j< m; j++){
if (pre_sum[j] - pre_sum[i] >0){
res = Math.max(res, j-i)
}
}
}
return res
};
刷题打卡记录
这里是之前的刷题打卡记录,大家有兴趣的可以看下,如果有什么不同的见解和看法或者觉得有什么错误的,欢迎在评论区留言!🙏🙏🙏
[LeetCode0303题区域和检索 - 数组不可变] | 刷题打卡
[LeetCode0304题二维区域和检索 - 矩阵不可变] | 刷题打卡
[LeetCode236题二叉树的最近公共祖先] | 刷题打卡
总结
多写写题解还是很有必要的,不要怕写的不好,写的过程就是回顾的过程,更容易加深自己的理解。
加油!hxdm!!!💪💪💪
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情