首页 > 其他分享 >LeetCode1024 -- 二分

LeetCode1024 -- 二分

时间:2023-03-16 21:48:02浏览次数:55  
标签:二分 -- LeetCode1024 mid len int 查找 区间

1. 题目描述

查找满足劳累天数严格大于不劳累天数的最大子区间



2. 思路

对于区间问题,很容易先想到前缀和帮助我们优化。
我们可以设,劳累=\(1\),不劳累=\(-1\),那么,就是求最大的子区间 [left,right] 使得 s[right]-s[left]-1>0 成立。
其实我们是很容易想到二分的,但在这里,二分有一点小小的问题!
先看一下错误的二分思路:
枚举每个区间长度 len,然后遍历整个区间,查找是否有满足条件的长为 len 的区间。
看起来好像没什么问题吧?其实有个很严重的问题!
我们可以想一下,如果存在长度为 \(x\) 的满足题目要求区间,一定有长度为 \(x-y\),\(x-y>=0\) 的满足题目要求的区间吗?
这是保证二分正确性的根本要求,即连续性。
其实是不满足的,例如,样例[9,6,9],它存在长度为 \(3\) 的区间,却不存在长度为 \(2\) 的区间,因此,不具备连续性,也就不能二分。
哎?我们的标题明明是二分啊。
确实,二分其实是可行的!只不过我们要变换一下二分的条件,将“查找是否有满足条件的长为 len 的区间”改为“查找是否有满足条件的长大于等于 len 的区间。”
这样,我们就能保证二分的连续行了!因为如果存在长为 \(x\) 的区间,一定存在长大于等于为 \(x-y\) 的区间,显然成立的!



3. 代码

class Solution {
public:
    int longestWPI(vector<int>& hours) {
        int n = hours.size();
        vector<int> s(n + 10);  // 前缀和
        vector<int> m(n + 10);  // 辅助数组,用来保存最小的左边界
        for(int i = 1; i <= n; i ++ ) { // 从 1 开始方便计算
            s[i] = s[i - 1] + ((hours[i - 1] > 8) ? 1 : -1);
            m[i] = min(m[i - 1], s[i]);
        }
        function<bool(int)> check = [&](int x) -> bool {
            for(int i = x; i <= n; i ++ ) {
                // [i-x+1,i]
                // 注意,这里是 s[i]-m[i-x]
                // 而不是 s[i]-s[i-x]
                // 前者找的是“最大”也就是“len>=x”合法区间
                // 后者找的是必须满足“len==x”的合法区间
                if(s[i] - m[i - x] > 0)   return true;   
            }
            return false;
        };
        int l = 0, r = n;
        while(l < r) {
            int mid = l + r + 1 >> 1;
            if(check(mid))  l = mid;
            else    r = mid - 1;
        }
        return l;
    }
};

标签:二分,--,LeetCode1024,mid,len,int,查找,区间
From: https://www.cnblogs.com/ALaterStart/p/17224244.html

相关文章

  • osg创建立方体
    osg创建立方体osg::Geode*createBox(doubleminX,doublemaxX,doubleminY,doublemaxY,doubleminZ,doublemaxZ){doubleX1=minX;doubleX2=max......
  • 爬虫相关 requests高级用法、解析json、ssl认证(了解)、使用代理(重要)、超时设置、
    requests高级用法解析json#发送http请求,返回的数据会有xml格式,也有json格式importrequestsdata={'cname':'','pid':'','keyword':'500','page......
  • 数据库连接池
    数据库连接池是个容器,负责分配、管理数据库连接。它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。释放空闲时间超过最大空闲时间的数据库连接来避免......
  • 博客索引(暂未完成)
    会更新的,会的吧会的吧AtcoderdpICoins题解 LinkCF1779CLeastPrefixSum题解  LinkLoj507接竹竿题解Link......
  • Object.definePropoty()方法详解
    Object.definePropoty()方法有三个参数第一个参数为:需要进行代理的目标对象,target第二个参数为:需要代理的这个对象中对应的"键"名,key第三个参数为:{}一个配置项......
  • cb
    点击查看代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Code</title><style>body{margin:0;......
  • DOS头+NT头+节表代码解析
    #include"stdafx.h"#include<malloc.h>#include<windows.h>LPVOIDreadPEFile(LPSTRpeFile)//LPVOID是一个没有类型的指针LPSTR",其相当于char*针{FI......
  • ChatGPT对于滤除微多普勒运动目标的解决方案
    上一篇体验了一把GPT的真香定律,赶紧又问了一些同事问的如何滤除微多普勒目标的问题。感觉还可以,后面可以试试看,具体大家可以一起看看这个回答,还是有一些可以采纳的意见......
  • 血泪的线上bug,有关Object.fromEntries
    因为这个线上bug引发的反思:1,兼容性测试的重要性2,代码review的重要性3,技术敏感的重要性还有很多……因为出现线上bug,这个链路上每个人都有责任和需要学习的地方,而作为......
  • 今日报告-25
    今日打卡所花时间(包括上课):6h代码量(行):380发表博客:3篇(不包括本篇)学习进度和了解到的知识点:今天继续完善第一次个人作业,实现了第二阶段功能,我实现了教师页面的登录,教师......