首页 > 其他分享 >【LeetCode】1124.表现良好的最长时间段

【LeetCode】1124.表现良好的最长时间段

时间:2023-02-14 22:45:22浏览次数:54  
标签:right hashmap 1124 score 时间段 result 右端 LeetCode left

【LeetCode】1124.表现良好的最长时间段

题目链接:1124.表现良好的最长时间段

前缀和

什么是前缀和:【算法】前缀和

我们计工作时间超过8小时为1,否则为-1,那么所谓的“表现良好的时间段”就是和大于0的区间。

暴力-0

最简单的方法是遍历所有可能的区间,判断是否和大于零,并返回和大于零的区间最大长度。

暴力-1

对暴力-0进行优化,由于是寻找最长的区间,固定区间左端,右端从大到小遍历,只要找到一个就行,然后左端移动,重复进行,则每一个左端对应一个长度,其中最长的即为所求。

暴力-2

继续优化,在循环中动态更新结果result,在大循环中,如果剩余的总长度不够result,不可能再找出比result更大的结果,直接返回。

暴力-3

我们也可以固定右端right,这样的话并没有对算法进行优化,但是更好理解。

我们用数组s表示前缀和,score表示正负一数组,则 \(\sum_{j=0}^{i-1}score[j]=s[i]\)。

那么我们的目标是找到左端left和右端right,使得 \(s[right]-s[left]>0\) 并且 \(right-left\) 最大。

由于我们固定了右端,初始情况下,\(left\) 为0,那么只要 \(s[right]>0\),那么对应的最长长度为 \(right\),而且这种情况下,后续移动右端将不会有更长的区间,直接判断 \(right\) 和 \(result\) 中更大的,如果 \(right\) 已经比 \(result\) 小,也是同理,直接返回 \(result\)。

如果 \(s[right]<0\),则需要找到最小的 \(left\),使得 \(left<right\) 且 \(s[right]>s[left]\)。由于s中的元素都是-1和1,当left从0增大,\(s[right]-s[left] < 0\) 每次以连续整数向 \(s[right]-s[left] > 0\) 变化,则最小满足条件的left一定有 \(s[right]-s[left] == 1\)。即,寻找最小的 \(left<right\) 使得 \(s[right]-s[left] == 1\),和【LeetCode】1.两数之和类似,使用hash表进行优化。

class Solution:
    def longestWPI(self, hours: List[int]) -> int:
        result = 0
        score = 0
        hashmap = {}
        for i in range(len(hours)):
            score = score + (1 if hours[i] > 8 else -1)
            if score not in hashmap:
                hashmap[score] = i
            if score > 0:
                result = max(i+1, result)
            elif score-1 in hashmap:
                result = max(i-hashmap[score-1], result)
        return result

标签:right,hashmap,1124,score,时间段,result,右端,LeetCode,left
From: https://www.cnblogs.com/yangxuanzhi/p/17121123.html

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:变位词组
    题目:编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。注意:本题相对原题稍作修改示例:输入:["eat","tea","tan","ate"......
  • #yyds干货盘点# LeetCode面试题:最长公共前缀
    1.简述:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 示例1:输入:strs=["flower","flow","flight"]输出:"fl"示例2:输入:strs=["......
  • [leetcode每日一题]2.14
    ​​1124.表现良好的最长时间段​​难度中等253给你一份工作时间表 ​​hours​​,上面记录着某一位员工每天的工作小时数。我们认为当员工一天中的工作小时数大于 ​​8......
  • LeetCode03 无重复字符的最长子串
    暴力解法,O(n²)publicintlengthOfLongestSubstring(Strings){ArrayList<Integer>lenList=newArrayList<>();for(inti=0;i<s.length......
  • [LeetCode] 1330. Reverse Subarray To Maximize Array Value 翻转子数组得到最大的数
    Youaregivenanintegerarray nums.The value ofthisarrayisdefinedasthesumof |nums[i]-nums[i+1]| forall 0<=i<nums.length-1.Youare......
  • 代码随想录算法训练营第二十四天|LeetCode 77. 组合
    77.组合文章:代码随想录(programmercarl.com)视频:带你学透回溯算法-组合问题(对应力扣题目:77.组合)|回溯法精讲!_哔哩哔哩_bilibili思路:那么我把组合问题抽象为如下树形......
  • leetcode:合并2个有序链表-easy
    题目:将两个升序链表合并为一个新的升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,......
  • leetcode:求两数之和-easy
    题目:给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答......
  • 【栈】LeetCode 394. 字符串解码
    题目链接394.字符串解码思路建立一个数字栈numStack和一个字符串栈stringBuilderStack。遍历字符串s:遇到数字和字符时按照相应规则分别累加进k和result中。......
  • #yyds干货盘点# LeetCode程序员面试金典:合并排序的数组
    题目:给定两个排序后的数组A和B,其中A的末端有足够的缓冲空间容纳B。编写一个方法,将B合并入A并排序。初始化 A和B的元素数量分别为 m和n。示例:输入:A=[1......