【算法】二分答案(TODO)

news2024/11/18 15:49:05

文章目录

  • 相关链接
  • 什么时候使用二分答案?
  • 题目列表
    • 最大化最小化相关题目列表📕
      • 2439. 最小化数组中的最大值
        • 解法1——二分答案
        • 解法2——分类讨论O(n)
      • 2513. 最小化两个数组中的最大值(二分答案+lcm+容斥原理)🐂好题!
      • 相似题目(TODO)
        • 878. 第 N 个神奇数字
        • 1201. 丑数 III
      • 2517. 礼盒的最大甜蜜度(二分答案)

相关链接

【力扣周赛】第 362 场周赛(⭐差分&匹配&状态压缩DP&矩阵快速幂优化DP&KMP)里面有一些二分答案的题目。
【力扣周赛】第 363 场周赛(完全平方数和质因数分解) T3是二分答案。

什么时候使用二分答案?

看到「最大化最小值」或者「最小化最大值」就要想到二分答案,这是一个固定的套路。

或者

答案不好直接求,但是可以判断某个数字是否可以满足题目要求且单调时。

具体看下面例题体会一下即可。

题目列表

最大化最小化相关题目列表📕

题目列表来源:https://leetcode.cn/problems/maximize-the-minimum-powered-city/solutions/2050272/er-fen-da-an-qian-zhui-he-chai-fen-shu-z-jnyv/
在这里插入图片描述

2439. 最小化数组中的最大值

https://leetcode.cn/problems/minimize-maximum-of-array/
在这里插入图片描述

提示:
n == nums.length
2 <= n <= 10^5
0 <= nums[i] <= 10^9

解法1——二分答案

class Solution {
    public int minimizeArrayValue(int[] nums) {
        int l = Integer.MAX_VALUE, r = Integer.MIN_VALUE;
        for (int x: nums) {
            l = Math.min(l, x);
            r = Math.max(r, x);
        }
        while (l < r) {
            int mid = l + r >> 1;
            if (check(mid, nums)) r = mid;
            else l = mid + 1;
        }
        return l;
    }

    public boolean check(int k, int[] nums) {
        if (nums[0] > k) return false;
        long d = k - nums[0];           // 使用long防止溢出
        for (int i = 1; i < nums.length; ++i) {
            if (nums[i] <= k) d += k - nums[i];
            else {
                d -= nums[i] - k;
                if (d < 0) return false;
            }
        }
        return true;
    }
}

解法2——分类讨论O(n)

首先最大值的最小值是 nums[0]。
对于 nums[1],当其 < nums[0] 时,答案还是 nums[0];当其 > nums[0] 时,则答案是两者的平均向上取整。

class Solution {
    public int minimizeArrayValue(int[] nums) {
        long mx = 0, sum = 0;
        for (int i = 0; i < nums.length; ++i) {
            sum += nums[i];
            // (sum + i) / (i + 1) 是因为要向上取整
            mx = Math.max(mx, (sum + i) / (i + 1));     
        }
        return (int)mx;
    }
}

2513. 最小化两个数组中的最大值(二分答案+lcm+容斥原理)🐂好题!

https://leetcode.cn/problems/minimize-the-maximum-of-two-arrays/
在这里插入图片描述

提示:
2 <= divisor1, divisor2 <= 10^5
1 <= uniqueCnt1, uniqueCnt2 < 10^9
2 <= uniqueCnt1 + uniqueCnt2 <= 10^9

二分答案。

class Solution {
    public int minimizeSet(int divisor1, int divisor2, int uniqueCnt1, int uniqueCnt2) {
        long l = 0, r = (long)Integer.MAX_VALUE;
        while (l < r) {
            long mid = l + r >> 1;
            // 两个数组不能选择的数字数量
            long x = mid / divisor1, y = mid / divisor2, z = mid / lcm(divisor1, divisor2);
            long sum = uniqueCnt1 + uniqueCnt2 + z;         // 至少需要的数字数量
            // arr1不能使用的,看arr2能不能使用;反之同理
            sum += Math.max(0, x - z - uniqueCnt2) + Math.max(0, y - z - uniqueCnt1);
            if (sum <= mid) r = mid;
            else l = mid + 1;
        }
        return (int)l;
    }

    // 最小公倍数
    public long lcm(long x, long y) {
        return x / gcd(x, y) * y;
    }

    // 最大公因数
    public long gcd(long x, long y) {
        return y == 0? x: gcd(y, x % y);
    }
}

相似题目(TODO)

878. 第 N 个神奇数字

https://leetcode.cn/problems/nth-magical-number/

在这里插入图片描述

在这里插入代码片

1201. 丑数 III

https://leetcode.cn/problems/ugly-number-iii/description/
在这里插入图片描述
提示:
1 <= n, a, b, c <= 10^9
1 <= a * b * c <= 10^18
本题结果在 [1, 2 * 10^9] 的范围内

在这里插入代码片

2517. 礼盒的最大甜蜜度(二分答案)

https://leetcode.cn/problems/maximum-tastiness-of-candy-basket/
在这里插入图片描述
提示:
2 <= k <= price.length <= 10^5
1 <= price[i] <= 10^9

class Solution {
    public int maximumTastiness(int[] price, int k) {
        Arrays.sort(price);
        int n = price.length, l = 0, r = price[n - 1] - price[0];
        while (l < r) {
            int mid = l + r + 1 >> 1;
            int s = 1, last = price[0];
            for (int i = 1; i < n && s < k; ++i) {
                if (price[i] - last >= mid) {
                    s++;
                    last = price[i];
                }
            }
            if (s < k) r = mid - 1;
            else l = mid;
        }
        return l;
    }
}

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

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

相关文章

VS code 下 makefile 【缺少分隔符 停下来】 报错解决方法

首先来看报错的makefile源码 再来看报错的信息&#xff1a; 第5行缺少分隔符&#xff0c;其实不止是第5行&#xff0c;只要是前面需要加tab留白的行都会报这个错误&#xff0c;比如说第7行第11行 编译的时候&#xff0c;前面的留白必须是按tab键生成的 但是&#xff01;&…

成为一个优秀的程序员必读书目有哪些?

首推一本刚刚出版的新书&#xff1a; 程序员的制胜技 新手程序员的生存指南&#xff0c;教你如何将理论转化为实践技能&#xff0c;解决编程工作中的挑战&#xff0c;拥有实战智慧&#xff0c;成为开发高手&#xff01; 作者20多年实战经验的结晶&#xff0c;新手程序员的生存…

从HTTP到HTTPS:网站安全通信的演进之路

HTTP协议与TCP/IP协议族内的其他协议相同部分&#xff0c;用于客户端和服务器端的通信。下面来看一下HTTP具体是怎么工作的。 1、HTTP前生今世 在HHTP/0.9版本&#xff0c;主要是通过确立了客户端请求、服务器端响应的通信流程来解决HTML文件传输&#xff0c;只能获取文本资源…

xen-trap

Xen-Trap xen的虚拟化实现有一个很重要的机制就是tarp&#xff0c;中文可以暂且叫做陷入。在ARMv8中&#xff0c;trap就是异常等级的一个切换。 当发生trap的时候&#xff0c;就会进入设定好的异常向量表中&#xff0c;硬件自动判断属于哪种类型的异常。 一、异常处理 ARM…

天然气跟踪监管系统信息更新

天然气跟踪监管系统信息更新 ① 新增仓库&#xff0c;第一步&#xff0c;“编辑仓库”对话框新增栏第二步&#xff0c;提交jQuery序列化新增仓库的form表单第三步&#xff0c;新增仓库成功第一步&#xff0c;创建编辑对象第二步&#xff0c;获取仓库修改后的几何图形及面积数据…

学习计算机网络中的一些疑问及解答

文章目录 前言一、为什么要进行三次握手二、三次握手的流程三、三次握手中seq和ack的值四、四次挥手流程五、四次挥手中seq和ack的值六、为什么要等待才回复七、为什么等待2MSL总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;在学习计算机网络的过程中遇…

CLR via C#(三)垃圾回收

一、资源生命周期 每个程序运行都需要各种资源&#xff0c;如文件、内存缓冲区、数据库等。要使用这些资源&#xff0c;就必须为代表资源的类型分配内存。访问一个资源所需的步骤如下&#xff1a; 调用IL指令newobj&#xff0c;为代表资源的类型分配内存&#xff08;在C#中一…

NSS [HNCTF 2022 WEEK2]ohmywordpress(CVE-2022-0760)

NSS [HNCTF 2022 WEEK2]ohmywordpress&#xff08;CVE-2022-0760&#xff09; 题目描述&#xff1a;flag在数据库里面。 开题&#xff1a; 顺着按钮一直点下去会发现出现一个按钮叫安装WordPress 安装完之后的界面&#xff0c;有一个搜索框。 F12看看network。 又出现了这个…

在 Android 设备或仿真器上进行测试

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 Windows Defender 概述 如何将排除项添加到 Windows Defender Android 开发时要考虑的排除项 本指南介绍如何在 W…

JavaScript逆向循环和嵌套循环

逆向循环 ● 我们还是使用以下这个数组进行演示 const ITshareArray ["张三","二愣子",2033 - 1997,"程序员",["李四", "王五", "牛二"], ];● 现在我们还是想循环的列出数组的值&#xff0c;但是我们倒着来&a…

l14 IO模型

一、基本概念 I/O即数据的读取&#xff08;接收&#xff09;或写入&#xff08;发送&#xff09;操作 通常用户进程中的一个完整I/O分为两个阶段 1.用户进程空间<-->内核空间 2.内核空间<-->设备空间&#xff08;磁盘、网卡等&#xff09; I/O分为内存I/O、网络…

Bash脚本学习 - 条件句、数组、for循环,函数

1. 条件测试 [ 和 ] 是一个用于执行条件测试的命令。它们必须用空格分隔开&#xff0c;并且在 [ 后面和 ] 前面必须有空格。-eq 是一个比较运算符&#xff0c;表示等于&#xff08;equal&#xff09;。它用于比较两个值是否相等。 2. 条件句 在 ifelseifelse.sh 文件中&#…

Acwing 827. 双链表

Acwing 827. 双链表 题目要求思路讲解初始化在第k个点右边插入&#xff1a;如果想在k的左边插入x&#xff0c;只要这样调用就可以了&#xff1a;删除怎么做&#xff1a; 代码展示 题目要求 思路讲解 初始化 在第k个点右边插入&#xff1a; 如果想在k的左边插入x&#xff0c;只…

【算法训练-二叉树 一】【遍历二叉树】前序遍历、中序遍历、后续遍历、层序遍历、锯齿形层序遍历、二叉树右视图

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【二叉树的遍历】&#xff0c;使用【二叉树】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为…

如何实现一个IO口读取多个设备信息

前言 &#xff08;1&#xff09;今天遇到一个有意思的问题一个IO口如何读取多个电机的堵转问题。之后他就发了一张图片 &#xff08;2&#xff09;看到这个问题&#xff0c;之前先说一个简单的。我们如何实现一个IO读取多个按键&#xff0c;了解了这个之后&#xff0c;对于多个…

Python 变量

视频版教程 Python3零基础7天入门实战视频教程 变量 无论使用什么语言编程&#xff0c;总要处理数据&#xff0c;处理数据就需要使用变量来保存数据。变量就像一个个小容器&#xff0c;用于“盛装”程序中的数据。 再说说&#xff0c;Python的数据类型&#xff0c;有以下六种…

Prometheus+Grafana 基础监控告警体系搭建(一):服务的基本安装

文章目录 1. prometheus 安装1.1. 下载安装包1.2. 基本设置1.3. 解压安装包1.4. 配置 service 启动文件1.5. 启动服务 2. Grafana 安装2.1. 下载安装包2.2. 安装2.3. 启动服务 3. 总结一下 打算重新练下手&#xff0c;免得忘记了&#xff0c;这次内网进行了全面部署演示&#x…

编程任务|随机摆放的刀叉开始认识数学思维

任务源自旧版的Brilliant数学讨论问题。2019-09-02我曾经发布过&#xff0c;可惜已经下线&#xff0c;幸活大喵做足备份。 该问题看似是概率问题&#xff0c;实则不然。 官方给出的解法透露出一个非常重要的数学思维方法&#xff1a; 数学语言 —— 为何以及如何构造一个函数 f…

计算机丢失msvcr110.dll解决办法,多种msvcr110.dll解决方法分享

随着 Windows 操作系统的发展&#xff0c;越来越多的用户在使用电脑时遇到了计算机丢失 msvcr110.dll 的问题。msvcr110.dll 是 Windows 操作系统中的一个动态链接库文件&#xff0c;它包含了许多常用的 C 运行库函数。因此&#xff0c;当计算机丢失 msvcr110.dll 时&#xff0…

Kotlin File useLines nameWithoutExtension extension

Kotlin File useLines nameWithoutExtension extension import java.io.Filefun main(args: Array<String>) {val filePath "myfile.txt"val file File(filePath)println(file.name) //文件名字&#xff0c;不包括路径println(file.isFile) //是文件吗pri…