【算法专题】二分查找(进阶)

news2024/11/20 18:30:46

📑前言

本文主要是二分查找(进阶)的文章,如果有什么需要改进的地方还请大佬指出⛺️

🎬作者简介:大家好,我是青衿🥇
☁️博客首页:CSDN主页放风讲故事
🌄每日一句:努力一点,优秀一点

在这里插入图片描述

目录

文章目录

  • 📑前言
  • **目录**
    • 二分法
      • 1. 爱吃香蕉的珂珂
      • 2. 在 D 天内送达包裹的能力
  • 📑文章末尾


二分法

二分法的特性:
1,题目满足单调性

2,待求解的值是0到无限的一个值

1. 爱吃香蕉的珂珂

leetcode875
珂珂喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。

珂珂可以决定她吃香蕉的速度 k (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 k 根。如果这堆香蕉少于 k 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。

珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。

返回她可以在 h 小时内吃掉所有香蕉的最小速度 k(k 为整数)。

示例 1:

输入:piles = [3,6,7,11], h = 8
输出:4
示例 2:

输入:piles = [30,11,23,4,20], h = 5
输出:30
示例 3:

输入:piles = [30,11,23,4,20], h = 6
输出:23

提示:

1 <= piles.length <= 104
piles.length <= h <= 109
1 <= piles[i] <= 109

思路:
1.满足单调性,待求解的值是1到1000000000的一个值
2.定义 target 是在一个在左闭右闭的区间里,也就是[left, right]
3.终止条件为right < left;

4.求最小速度,即求左边界,可以结合单调递减的图去写
本题注意点:
1.因为取值左闭右边,f(x)函数需要取long类型,因为速度如果用1去计算,取值int类型值会溢出
Java代码如下:

class Solution {
    public int minEatingSpeed(int[] piles, int H) {
        int left = 1;
        int right = 1000000000;

        while (left <= right) {
            int mid = left + (right - left) / 2;
            //求最小速度,即求左边界,结合单调递减
            if (f(piles, mid) == H) {
                right = mid - 1;
            } else if(f(piles, mid) < H) {
                right = mid - 1;
            } else {
                left = mid + 1; 
            }
        }
        return right + 1;
    }

    // 定义:速度为 x 时,需要 f(x) 小时吃完所有香蕉
    // f(x) 随着 x 的增加单调递减
    long f(int[] piles, int x) {
        long hours = 0;
        for (int i = 0; i < piles.length; i++) {
            hours += piles[i] / x;
            if (piles[i] % x > 0) {
                hours++;
            }
        }
        return hours;
    }
}

2. 在 D 天内送达包裹的能力

leetcode1011

传送带上的包裹必须在 days 天内从一个港口运送到另一个港口。
传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量(weights)的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。
返回能在 days 天内将传送带上的所有包裹送达的船的最低运载能力。
示例 1:

输入:weights = [1,2,3,4,5,6,7,8,9,10], days = 5
输出:15
解释:
船舶最低载重 15 就能够在 5 天内送达所有包裹,如下所示:
第 1 天:1, 2, 3, 4, 5
第 2 天:6, 7
第 3 天:8
第 4 天:9
第 5 天:10

请注意,货物必须按照给定的顺序装运,因此使用载重能力为 14 的船舶并将包装分成 (2, 3, 4, 5), (1, 6, 7), (8), (9), (10) 是不允许的。
示例 2:

输入:weights = [3,2,2,4,1,4], days = 3
输出:6
解释:
船舶最低载重 6 就能够在 3 天内送达所有包裹,如下所示:
第 1 天:3, 2
第 2 天:2, 4
第 3 天:1, 4
示例 3:

输入:weights = [1,2,3,1,1], days = 4
输出:3
解释:
第 1 天:1
第 2 天:2
第 3 天:3
第 4 天:1, 1
提示:
1 <= days <= weights.length <= 5 * 104
1 <= weights[i] <= 500
思路:
1,与上一题类似,都是求最小,即左边界
本题注意点:
1.如果left取最小值,right取最大值会溢出

代码如下:

class Solution {
    public int shipWithinDays(int[] weights, int days) {
        int left = 0;
        int right = 1;
        for (int w : weights) {
            //包裹不能拆开运所以至少保证载重能承载任意一个包裹
            left = Math.max(left, w);
            //最大运力保证刚好一次性运完所有包裹
            right += w;
        }
        //求最低运载能力,即求左边界,结合单调递减
        while(left <= right) {
            int mid = (right - left) / 2 + left; 
            if(f(weights,mid) == days) {
                right = mid - 1;
            }else if(f(weights,mid) < days) {
                right = mid - 1;
            }else {
                left = mid + 1;
            }
        }
        return right + 1;
    }
    //x为运载能力,f(x)返回需要的天数,时间复杂度为o(n)
    //f(x)是单调递减的
    public int f(int[] weight,int x){
        int n = weight.length;
        int sum = 0;
        int k = 0;
        int i = 0;
        while(i < n) {
            k = x;
            while(i < n  && k >= weight[i] ) {
                k = k - weight[i]; 
                i++;
            }
            sum++;
        }
       return sum;
        }

    }

📑文章末尾

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1416910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【代码随想录】LC 242. 有效的字母异位词

文章目录 前言一、题目1、原题链接2、题目描述 二、解题报告1、思路分析2、时间复杂度3、代码详解 前言 本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记&#xff0c;如有侵权&#xff0c;立即删除。 一、题目 1、原题链接 242. 有效的字母异位词 2、题目描述 二、解题…

【c++】类和对象 - 类的引入和定义

1.类的引入 C语言结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。比如&#xff1a;之前在数据结构初阶中&#xff0c;用C语言方式实现的栈&#xff0c;结构体中只能定义变量&#xff1b;现在以C方式实现&#xff0c;…

java日志框架总结(三 、Log4j日志框架)

一、简介 Log4j ( Logger For Java ) , Java 日志的记录包。 官方网站 。Log4j 是 Apache 的一个开源项目&#xff0c; 为Java提供了日志记录功能。能够让程序员非常方便的记录日志&#xff0c; 并且提供了多种适配方式&#xff0c;能满足各种需求。 使用Log4j 只需要导入一个…

linux0.11源码看信号的处理流程

序 日常Linux写代码或者使用中难免会使用siganl&#xff0c;包括我们使用ctrl-c结束程序&#xff0c;使用kill命令发送信号&#xff0c;或者说程序core后操作系统向程序发送的信号&#xff0c;以及我们程序内部自定义的信号处理。 我们选择linux0.11一个原因是它比较简单&…

基于springboot宠物领养系统

摘要 随着社会的不断发展和人们生活水平的提高&#xff0c;宠物在家庭中的地位逐渐上升&#xff0c;宠物领养成为一种流行的社会现象。为了更好地管理和促进宠物领养的过程&#xff0c;本文基于Spring Boot框架设计和实现了一套宠物领养系统。该系统以用户友好的界面为特点&…

游戏开发丨基于Tkinter的扫雷小游戏

文章目录 写在前面扫雷小游戏需求分析程序设计程序分析运行结果系列文章写在后面 写在前面 本期内容 基于tkinter的扫雷小游戏 所需环境 pythonpycharm或anaconda 下载地址 https://download.csdn.net/download/m0_68111267/88790713 扫雷小游戏 扫雷是一款广为人知的单…

【SpringSpringBoot】概述

Spring&SpringBoot专题 【注】&#xff1a; 本专题围绕框架核心概念展开&#xff0c;渐进式深入总结学习、面试、开发经验&#xff0c;集中整理便于回顾 持续补充与施工中~~~~ 1.发展史 2.基本架构 Spring框架的基本架构是一个分层架构&#xff0c;包括多个模块&#x…

漏洞原理反射型XSS漏洞

漏洞原理XSS漏洞 1 反射型XSS php基础链接 Web渗透编程语言基础-CSDN博客 正常思维 http://127.0.0.1/websec/day01/xss_reflect.php?name%E6%88%91%E6%98%AF%E8%B0%81 http://127.0.0.1/14_WEBSEC/DAY01/xss_reflect.php?name我是谁 黑客思维 http://127.0.0.1/websec…

【Python基础017】Python中如何进行异常判断(try...except...的使用)

1、异常判断 在python程序在运行的过程中可能会出现很多错误&#xff0c;比如语法、未定义变量、分母为0等错误&#xff1b;而我们通常使用try...except...语句来处理程序在运行中出现的这些异常&#xff0c;并显示出现错误的原因。此外&#xff0c;我们还可以用try...finally.…

Java多线程基础-18:线程安全的集合类与ConcurrentHashMap

Java标准库提供了很多集合类&#xff0c;但有一些集合类是线程不安全的&#xff0c;也就是说&#xff0c;在多线程环境下可能会出问题的。常用的ArrayList&#xff0c;LinkedList&#xff0c;HashMap&#xff0c;PriorityQueue等都是线程不安全的&#xff08;Vector, Stack, Ha…

AI技术大揭秘:探索人工智能的核心领域与必备技能

随着人工智能的不断进步&#xff0c;AI技术在各个领域都发挥着越来越关键的作用。想要成为AI领域的从业者&#xff0c;不仅需要对整体格局有清晰认识&#xff0c;更要掌握关键技术和必备技能。本文将深入解析AI的核心技术领域&#xff0c;以及在这个前沿领域里需要掌握的技能。…

java 基础学习1

目录 一.注释 二.关键字 三.字面量 四.变量和标识符 五.键盘录入 六.运算符 一.注释 1.单行注释&#xff1a;//注释信息 2.多行注释&#xff1a;/* 注释信息*/ 3.文档注释&#xff1a;/** 注释信息*/ 注:文档注释暂时用不上 二.关键字 关键字: 被Java赋予了特定…

任意一个函数都可以写成一个奇函数与一个偶函数之和的形式

定义 张宇30讲明确指出 f(x)f(-x)必定是偶函数 f(x)-f(-x)必定是奇函数 前提&#xff1a;定义域关于原点对称 由上述结论得到&#xff1a;任意一个函数都可以写成一个奇函数与一个偶函数之和的形式&#xff0c;即使该函数是非奇非偶的。 f(x) 1 2 \frac 12 21​[f(x) f(-x)]…

麒麟系统—— openKylin 安装 mongodb

麒麟系统—— openKylin 安装 mongodb 一、准备工作1. 确保麒麟系统 openKylin 已经安装完毕。 二、下载解压 MongoDB二、增加环境变量三、配置MongoDB创建数据目录创建日志文件运行 四、加入到服务中 MongoDB是一款高性能、开源的NoSQL数据库&#xff0c;因其灵活的数据结构、…

DCNv4:对视觉应用的动态和稀疏算子的重新思考

摘要 https://arxiv.org/pdf/2401.06197.pdf 我们介绍了可变形卷积v4&#xff08;DCNv4&#xff09;&#xff0c;这是一种高效且有效的运算符&#xff0c;专为广泛的视觉应用而设计。DCNv4解决了其前身DCNv3的局限性&#xff0c;通过两个关键改进&#xff1a;1. 去除空间聚合中…

java抽象类概述——abstract关键字用法

前言&#xff1a; 打好基础&#xff0c;daydayup! 抽象类 抽象类概述 在java中有一个关键字叫abstract&#xff0c;代表抽象的意思&#xff0c;可用abstract修饰类&#xff0c;成员方法。 抽象类修饰方法 在方法或类前加上abstract关键字 例1&#xff1a;修饰类&#xff08;在…

AI决策的解构与实践:初探可解释性技术(XAI)

随着人工智能&#xff08;AI&#xff09;技术在各个领域的广泛应用&#xff0c;解释性人工智能&#xff08;XAI&#xff09;的概念备受瞩目。作为开发者&#xff0c;我们深知AI系统的复杂性&#xff0c;以及对于用户和利益相关者来说理解AI决策过程的重要性。本文将深入探讨可解…

跟着pink老师前端入门教程-day12

二十六、HTML5CSS3的提高 1、HTML5 的新特性 HTML5 的新增特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等 这些新特性都有兼容性问题&#xff0c;基本是 IE9 以上版本的浏览器才支持&#xff0c;如果不考虑兼容性问题&#xff0c;可以…

MyBatis详解(5)-- MyBatis注解

MyBatis详解&#xff08;5&#xff09; 注解映射器xml配置文件的缺陷&#xff1a;常用注解1.基本注解&#xff1a;实现简单的增删改查操作。Insert 新增Options(useGeneratedKeys true, keyProperty "主键属性") 主键回填SelectKey ( statement "自增规则&qu…

漏洞复现-EduSoho任意文件读取漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…