[LeetCode1124题表现良好的最长时间段] | 刷题打卡

568 阅读2分钟

前言

跟昨天一样,今天的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题区域和检索 - 数组不可变] | 刷题打卡

[LeetCode1200. 最小绝对差] | 刷题打卡

[LeetCode0304题二维区域和检索 - 矩阵不可变] | 刷题打卡

[LeetCode11题盛最多水的容器] | 刷题打卡

[LeetCode0338题比特位计数] | 刷题打卡

[LeetCode209题长度最小的子数组] | 刷题打卡

[LeetCode236题二叉树的最近公共祖先] | 刷题打卡

[LeetCode141题环形链表] | 刷题打卡

[LeetCode53题最大子序和] | 刷题打卡

[LeetCode48题旋转图像] | 刷题打卡

[LeetCode155题最小栈] | 刷题打卡

总结

多写写题解还是很有必要的,不要怕写的不好,写的过程就是回顾的过程,更容易加深自己的理解。

加油!hxdm!!!💪💪💪

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情