【LeetCode专题】二分答案

2023-11-18

本人参考yxc-y总的刷题课,总结了二分查找的两个模板:HERE
本专题为二分查找算法的应用——二分答案

LeetCode 875. 爱吃香蕉的珂珂

题目

思路

因为当k很大时,一定能在h小时内完成,因此答案可以进行二分。

二分答案:找右区间的左端点,即 【在 h 小时内吃掉所有香蕉的最小速度 k】。只需要计算吃掉所有香蕉所需要的时间sum,如果sum <= h 说明速度太快,需要降低速度(r = mid),sum > h 说明速度太慢,时间太久,需要提高速度k(mid = l + 1)。

代码

class Solution {
public:
    bool check(vector<int>& piles, int h, int k){
        int sum = 0;
        for(int i = 0; i < piles.size(); i++){
            sum += piles[i] / k;
            if(piles[i] % k) sum++;
        }
        // cout << sum << " " << k << endl;
        // 二分答案:找右区间的左端点
        if(sum > h) return true; // 如果时间多了,就让速度k提高,否则降低速度k
        return false;
    }
    int minEatingSpeed(vector<int>& piles, int h) {
        int l = 1, r = 1e9+1;
        while(l < r){
            int mid = l + ((r - l) >> 1); // 需要加括号, 因为'+'优先级大于'>>'
            if(check(piles, h, mid)) l = mid + 1;
            else r = mid;
        }
        return l;
    }
};

LeetCode 2187. 完成旅途的最少时间

题目 示例

【返回完成 至少 totalTrips 趟旅途需要花费的 最少 时间】
输入:time = [1,2,3], totalTrips = 5
输出:3
解释:
- 时刻 t = 1 ,每辆公交车完成的旅途数分别为 [1,0,0] 。
  已完成的总旅途数为 1 + 0 + 0 = 1 。
- 时刻 t = 2 ,每辆公交车完成的旅途数分别为 [2,1,0] 。
  已完成的总旅途数为 2 + 1 + 0 = 3 。
- 时刻 t = 3 ,每辆公交车完成的旅途数分别为 [3,1,1] 。
  已完成的总旅途数为 3 + 1 + 1 = 5 。
所以总共完成至少 5 趟旅途的最少时间为 3 。

时间越多,可以完成的旅途也就越多,因此答案可以二分。

代码

class Solution {
typedef long long LL;
public:
    bool check(vector<int>& time, int totalTrips, LL mid){
        LL sum = 0;
        for(int i = 0; i < time.size(); i ++){
            sum += (mid / (LL)time[i]);
            if(sum >= totalTrips) return false;
        }
        return true;
    }

    LL minimumTime(vector<int>& time, int totalTrips) {
        LL l = 1, r = LLONG_MAX;
        while(l < r){
            LL mid = l + ((r - l) >> 1);
            if(check(time, totalTrips, mid)) l = mid + 1;
            else r = mid;
        }
        return l;
    }
};

LeetCode 6325. 修车的最少时间

题目 示例

输入:ranks = [4,2,3,1], cars = 10
输出:16
解释:
- 第一位机械工修 2 辆车,需要 4 * 2 * 2 = 16 分钟。
- 第二位机械工修 2 辆车,需要 2 * 2 * 2 = 8 分钟。
- 第三位机械工修 2 辆车,需要 3 * 2 * 2 = 12 分钟。
- 第四位机械工修 4 辆车,需要 1 * 4 * 4 = 16 分钟。
16 分钟是修理完所有车需要的最少时间。

思路

如果可以用 t 分钟修完所有车,那么同样可以用大于 t 分钟的时间修完所有车。
如果无法用 t 分钟修完所有车,那么同样无法用小于 t 分钟的时间修完所有车。
有单调性,可以二分答案。

代码

class Solution {
public:
    bool check(vector<int>& ranks, int cars, long long time){
        long long sum = 0;
        for(int i = 0; i < ranks.size(); i++){
            sum += (sqrt(time / (long long)ranks[i]));
            // cout << time << " " << sum << endl;
            if(sum >= cars) return false;
        }
        return true;
    }
    long long repairCars(vector<int>& ranks, int cars) {
        long long l = 1, r = LLONG_MAX;
        while(l < r){
            long long mid =  l + ((r-l) >> 1);
            // 找右区间的左端点
            if(check(ranks, cars, mid)) l = mid+1;
            else r = mid;
        }
        return l;
    }
};

LeetCode 2226. 每个小孩最多能分到多少糖果

题目 示例

输入:candies = [5,8,6], k = 3
输出:5
解释:可以将 candies[1] 分成大小分别为 5 和 3 的两堆,
然后把 candies[2] 分成大小分别为 5 和 1 的两堆。现在就有五堆大小分别为 5、5、3、5 和 1 的糖果。
可以把 3 堆大小为 5 的糖果分给 3 个小孩。可以证明无法让每个小孩得到超过 5 颗糖果。

代码

class Solution {
typedef long long LL;
public:
   int maximumCandies(vector<int>& candies, LL k) {
       LL l = 0, r = 1e12+1;
       while(l < r){
           // 找左区间的右端点
           LL mid = l + ((r - l + 1) >> 1);
           LL cnt = 0;
           for(auto x : candies) cnt += x / mid;
           if(cnt >= k) l = mid;
           else r = mid - 1;
       }
       return l;
   }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【LeetCode专题】二分答案 的相关文章

随机推荐

  • 设计模式,简单工厂模式实现商场促销问题。

    前言 自始至终觉得编程是一门技术 更是一门艺术 不能只满足于写完代码运行后的结果完事 还应该让后人能读懂 容易修改 容易扩展和复用 又由于自己经常写出屎山代码 所以准备苦学设计模式 尽力写出更加优雅的代码 正文 问题引入 定义一个商场收银软
  • 【MedusaSTears】解决IDEA卡顿,IDEA2019.2启动加速;Eclipse启动加速:JVM调优--让你的IDE如丝般顺滑~

    目录 idea64 exe vmoptions文件内容如下 请自己对照你自己的编写 别直接粘贴我的 否则后果自负 eclipse ini文件内容如下 请自己对照你自己的编写 别直接粘贴我的 否则后果自负 具体我也解释不清楚 反正就是参考了不
  • 有用的 C# 库

    1 caliburn micro 数据绑定的库 比自带mvvm更好一些 2 https github com xceedsoftware wpftoolkit wpf的空间库
  • 字符编码简介

    目录 一 ascii编码 二 扩展ascii编码 三 多字节编码 multi bytes 四 宽字符编码 wide char 五 unicode编码 六 utf 8编码 七 结语 大家好 我是略游 本文的目的是讲清楚 字符编码的今生来世 看
  • 农业掀起“上链”潮 区块链等数字技术正成为乡村振兴新动力

    目前区块链等数字技术已经广泛应用于农业全链条环节 近日 由中国宏观经济研究院课题组撰写的 数字技术赋能乡村产业发展报告 下简称 报告 指出 长期以来困扰乡村产业发展的难点 堵点正在逐渐被区块链等数字技术所消弭和破解 中国宏观经济研究院所做的
  • 高性能中间件-RabbitMQ

    高性能中间件 RabbitMQ 高性能中间件 RabbitMQ 1 RabbitMQ是什么 2 RabbitMQ的整体结构 3 SpringBoot集成RabbitMQ 4 RabbitMQ丢失消息和解决方案 5 RabbitMQ的应用实践
  • 为分布式做准备吧——远程调用服务(RPC)和基于消息的通信(Message Queue)对比

    文章目录 系统结构 功能特点 应用 系统结构 RPC Message Queue 调用方式 Consumer lt gt Provider Sender lt gt Queue lt gt Receiver 调用对象 Consumer调用的
  • eNSP:VLAN相关实验

    一 实验要求 二 实验步骤 1 建立拓扑 2 创建并配置VLAN 2 将交换机上各个接口划分到对应的vlan中 3 配置Trunk干道 4 配置单臂路由 路由器子接口 5 设置所有PC端为DHCP 6 测试
  • 为支撑小程序接口,配置https

    1 从阿里云购买免费的ssl证书 博主太穷 买不起付费的 https common buy aliyun com spm 5176 7968328 1290860 26 59b61232sjkAJj commodityCode cas re
  • Nginx(六)Nginx请求处理机制

    转载自 本文为您解读 Nginx是如何处理请求的 让你从逻辑上有一个清晰的认识 1 处理什么样的请求 处理访问到 Nginx 所在 IP 地址的请求 并且这些请求的 HTTP 头信息中的 Host 为所要处理的域名 如下以80端口为例 如下
  • zabbix使用Omsa来监控Dell服务器的硬件信息

    OMSA介绍 Dell OpenManage Server Administrator OMSA 是一款全面的一对一系统管理解决方案 OMSA可分为两种 集成式界面 基于Web浏览器的图形用户界面 GUI 命令行界面 CLI 通过操作系统访
  • java中如何通过JDBC的方式连接sqlserver2005多实例数据库?

    java语言中 通过jdbc访问sqlserver2005数据库默认实例可以按正常的写法来建立url连接 代码如下 Connection cn DriverManager getConnection jdbc sqlserver 172 1
  • docker安装mongodb提示bash: mongo: command not found

    docker安装MongoDB容器 docker run d p 27017 27017 name mongodb e MONGO INITDB ROOT USERNAME admin e MONGO INITDB ROOT PASSWOR
  • 嵌入式数据库——sqlite3

    前言 数据库是 按照数据结构来组织 存储和管理数据的仓库 是一个长期存储在计算机内的 有组织的 可共享的 统一管理的大量数据的集合 数据库是以一定方式储存在一起 能与多个用户共享 具有尽可能小的冗余度 与应用程序彼此独立的数据集合 可视为电
  • DataGridView实现添加合计行并始终显示在底部

    DataGridView中没有合适的方法来冻结底部的合计行 这里用一种比较简单的方式实现 1 数据部分的DataGridView 不带任何滚动框2 合计部分的DataGridView 带有横向滚动框3 在画面上添加一个纵向滚动框实现的主要思
  • python爬虫网络出错怎么办_python爬虫之headers处理、网络超时问题处理

    1 请求headers处理 我们有时请求服务器时 无论get或post请求 会出现403错误 这是因为服务器拒绝了你的访问 这时我们可以通过模拟浏览器的头部信息进行访问 这样就可以解决反爬设置的问题 importrequests 创建需要爬
  • Rxjava+Retrofit嵌套处理请求,并优雅的处理异常

    前情提示 本文只是一个例子 不做过多讲解 入门知识推荐参考 仍物线大神讲解的Rxjava 如何优雅的处理服务器异常 本文没有对Rxjava进行任何封装 也没有使用retrolambda 因为对于初学者来说 看起来费 不 劲 会 而且也没必要
  • 跳转页面保存输入的信息到url上,Js现实

    Js现实 获取用户点击岗位的次数 params act add id info bx id click num click num 获取岗位选中的值 params params auth role id now id 拼接其他数据 var
  • spring源码--04--IOC原理--XmlBeanFactory(IOC容器)的初始化(不细)

    XmlBeanFactory IOC容器 的初始化 不细 1 验证过程 代码地址 https gitee com DanShenGuiZu learnDemo tree master spring源码学习 spring source lea
  • 【LeetCode专题】二分答案

    本人参考yxc y总的刷题课 总结了二分查找的两个模板 HERE 本专题为二分查找算法的应用 二分答案 目录 LeetCode 875 爱吃香蕉的珂珂 LeetCode 2187 完成旅途的最少时间 LeetCode 6325 修车的最少时