LeetCode 1552. Magnetic Force Between Two Balls【二分,排序,贪心】中等

news2024/12/29 9:37:23

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

在代号为 C-137 的地球上,Rick 发现如果他将两个球放在他新发明的篮子里,它们之间会形成特殊形式的磁力。Rick 有 n 个空的篮子,第 i 个篮子的位置在 position[i] ,Morty 想把 m 个球放到这些篮子里,使得任意两球间 最小磁力 最大。

已知两个球如果分别位于 x 和 y ,那么它们之间的磁力为 |x - y| 。

给你一个整数数组 position 和一个整数 m ,请你返回最大化的最小磁力。

示例 1:

输入:position = [1,2,3,4,7], m = 3
输出:3
解释:将 3 个球分别放入位于 147 的三个篮子,两球间的磁力分别为 [3, 3, 6]。最小磁力为 3 。我们没办法让最小磁力大于 3

示例 2:

输入:position = [5,4,3,2,1,1000000000], m = 2
输出:999999999
解释:我们使用位于 11000000000 的篮子时最小磁力最大。

提示:

  • n == position.length
  • 2 <= n <= 10^5
  • 1 <= position[i] <= 10^9
  • 所有 position 中的整数 互不相同 。
  • 2 <= m <= position.length

解法 二分+排序+贪心

本题与LeetCode 2517. Maximum Tastiness of Candy Basket几乎完全一样,都是极大化极小。如果题目中有「最大化最小值」或者「最小化最大值」,一般都是二分答案,请记住这个套路

为什么?对于本题来说,任意两球间最小磁力越大,能放置的球越少,有单调性,所以可以二分。定义 f ( d ) f(d) f(d) 表示最小磁力至少为 d d d 时,至多能放多少个球在这些篮子里。于是二分答案 d d d

  • 如果 f ( d ) ≥ m f(d)\ge m f(d)m ,说明答案至少为 d d d 。在区间左侧外面的 d d d 都是 f ( d ) ≥ m f(d)\ge m f(d)m 的。
  • 如果 f ( d ) < m f(d)< m f(d)<m ,说明答案至多为 d − 1 d-1 d1 。在区间右侧外面的 d d d 都是 f ( d ) < m f(d)<m f(d)<m 的。
  • 二分结束后,设答案为 d 0 \textit{d}_0 d0 ,那么 f ( d 0 ) ≥ m f(d_0)\ge m f(d0)m f ( d 0 + 1 ) < m f(d_0+1)< m f(d0+1)<m ,这就是满足题意「放 m m m 个球到篮子里」,能得到的最大化的最小磁力 d 0 d_0 d0

二分上界可以取 ⌊ max ⁡ ( position ) − min ⁡ ( position ) m − 1 ⌋ \left\lfloor\dfrac{\max(\textit{position})-\min(\textit{position})}{m-1}\right\rfloor m1max(position)min(position) 。这是因为最小磁力(即使是最大化的也)不会超过平均值

class Solution {
public:
    int maxDistance(vector<int>& position, int m) {
        sort(position.begin(), position.end());
        int n = position.size();
        int l = 0, r = (position[n - 1] - position[0]) / (m - 1);
        while (l < r) {
            int mid = (l + r + 1) >> 1;
            int cnt = 1;
            // for (int i = 0, j; i < n; i = j) {
            //     j = lower_bound(position.begin() + i + 1, position.end(),
            //         position[i] + mid) - position.begin();
            //     if (j != n) ++cnt; // 找到一个数position[j],和position[i]差>=mid
            // }
            for (int pre = position[0], i = 1; i < n; ++i) {
                if (position[i] >= pre + mid) {
                    pre = position[i];
                    ++cnt;
                }
            }
            if (cnt >= m) l = mid;
            else r = mid - 1;
        }
        return l;
    }
};

复杂度分析:

  • 时间复杂度: O ( n log ⁡ n + n log ⁡ U ) \mathcal{O}(n\log n + n\log U) O(nlogn+nlogU) ,其中 n n n position \textit{position} position 的长度, U = ⌊ max ⁡ ( position ) − min ⁡ ( position ) m − 1 ⌋ U=\left\lfloor\dfrac{\max(\textit{position})-\min(\textit{position})}{m-1}\right\rfloor U=m1max(position)min(position)
  • 空间复杂度: O ( 1 ) \mathcal{O}(1) O(1) ,忽略排序的空间,仅用到若干额外变量。

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

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

相关文章

内存栈与CPU栈机制

1. 内存栈: 先入后出,LIFO(LAST IN FIRST OUT) 入栈:将一个新的元素放到栈顶 出栈:从栈顶取出一个元素 栈顶元素总是最后一个入栈,需要时出栈. 2.CPU栈机制 8086CPU提供相关指令以栈方式来访问内存空间.相当于将一段内存当做栈来使用 8086CPU提供的入栈指令为:PUSH ,出栈指令为…

【Linux】序列化和反序列化

目录 &#x1f308;前言&#x1f338;1、应用层&#x1f33a;2、重谈协议&#x1f341;3、网络计算器&#x1f361;3.1、定制协议&#x1f362;3.2、样例代码 &#x1f308;前言 这篇文章给大家带来序列化和反序列化的学习&#xff01;&#xff01;&#xff01; &#x1f338;…

chatgpt赋能python:Python倒序for:如何优化循环遍历

Python倒序for&#xff1a;如何优化循环遍历 Python作为一门高级编程语言&#xff0c;一直以来都在开发者中得到广泛的应用。在日常的编程工作中&#xff0c;遍历列表&#xff08;List&#xff09;和元组&#xff08;Tuple&#xff09;是很常见的操作。而对于列表或元组的倒序…

NLP(五十四)tiktoken的使用

tiktoken是OpenAI于近期开源的Python第三方模块&#xff0c;该模块主要实现了tokenizer的BPE&#xff08;Byte pair encoding&#xff09;算法&#xff0c;并对运行性能做了极大的优化。本文将介绍tiktoken模块的使用。 tiktoken简介 BPE(Byte pair encoding)算法是NLP中常见的…

Redis系列---Redis网络模型1

我们都知道&#xff0c;redis的高性能是具有多方面的因数&#xff0c;如&#xff1a;运行在内存上&#xff0c;单线程命令&#xff0c;io多路复用技术等&#xff0c;对于redis高性能的探究&#xff0c;就需要深入的研究其工作原理&#xff0c;这就涉及到redis的网络模型了&…

python实现单链表、双链表、反转链表(二)

一、链表概述 链表是有元素组成的数据结构&#xff0c;每个元素都是单独对象&#xff0c;包含数据和指针信息 链表中的每个元素称为节点&#xff0c;如下所示&#xff0c;第一个节点称为Head(头节点)&#xff0c;为链表的入口点&#xff0c;如果链表为空&#xff0c;则Head指…

Vue.js 比较重要知识点总结二

概述 vue3 组合式API生命周期钩子函数有变化吗&#xff1f;Composition API 与 Options API 有什么区别&#xff1f;watch 和 watchEffect 的区别&#xff1f;vue2 如何升级到 vue3 ? vue3 组合式API生命周期钩子函数有变化吗&#xff1f; 选项式API 和 组合式API 生命周期…

Java的继承性

1.为什么要有类的继承性&#xff1f;(继承性的好处&#xff09; ① 减少了代码的冗余&#xff0c;提高了代码的复用性② 便于功能的扩展③ 为之后多态性的使用&#xff0c;提供了前提 2.子类继承父类以后有哪些不同&#xff1f; 2.1体现&#xff1a; 一旦子类A继承父类B以…

汇编基础学习

1. 利用ldr向寄存器里面写较大数据&#xff0c;和设置寄存器的某些位 2. 这个lable 不对呢 验证宏值加载到寄存器里是正确的。 pc 的地址是0x80594 当前pc指针加上宏定义值的地址值。 3 打印字符串 字符串加载了8个字节到寄存器里面&#xff0c; 如何调试打印出来呢&#xff1…

数据库设计的原则有哪些

数据库设计是程序开发的核心部分&#xff0c;标准的数据库设计原则和步骤能有效提高开发进度和效率。 数据库设计(Database Design)是指对于一个给定的应用环境&#xff0c;构造最优的数据库模式&#xff0c;建立数据库及其应用系统&#xff0c;使之能够有效地存储数据&#xf…

RK3588平台开发系列讲解(驱动基础篇)中断相关函数

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、获取中断号相关函数二、申请中断函数三、free_irq 函数四、中断处理函数五、中断使能和禁止函数沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Linux 中断有专门的中断子系统,其实现原理很复杂,但是驱…

Git详解——安装、使用、搭建、IDEA集成

Git 看目录&#xff0c;越往后面越重要 目录一、git是什么&#xff1f;二、为什么要使用Git&#xff1f;三、版本控制工具四、git下载安装以及环境配置五、git基本命令六、git项目搭建七、远程仓库怎么搞&#xff1f;git,gitlab,github,gitee区别八、idea集成Git 一、Git是什…

HBase2.2.2安装(单机、伪分布)

系列文章目录 Ubuntu常见基本问题 Hadoop3.1.3安装&#xff08;单机、伪分布&#xff09; Hadoop集群搭建 HBase2.2.2安装&#xff08;单机、伪分布&#xff09; Zookeeper集群搭建 文章目录 系列文章目录前置条件一、HBase2.2.2安装二、配置环境变量1、问题 三、单机模式1、修…

浅谈数字化

一、数字化转型 数字化转型&#xff08;Digital transformation&#xff09;是建立在数字化转换&#xff08;Digitization&#xff09;、数字化升级&#xff08;Digitalization&#xff09;基础上&#xff0c;进一步触及公司核心业务&#xff0c;以新建一种商业模式为目标的高…

仙人掌之歌——权力的游戏(3)

像疯子一样死去 陈速没想到李通是在香山深处一所疗养院里休养&#xff0c;军方的岗位森严&#xff0c;进去还得把身份证押在门卫室。李通穿着病号服悠哉地晃过来把陈速领了进去。 “通哥&#xff0c;这儿真是个好地方啊。” 陈速由衷地赞叹着&#xff0c;望着大院里古树参天&…

九、Spring Cloud—gateway网关

一、引言 每个微服务都需和前端进行通信&#xff0c;解决每个微服务请求时的鉴权、限流、权限校验、跨域等逻辑&#xff0c;放在一个统一的地方进行使用。 在微服务架构中&#xff0c;网关是一个重要的组件&#xff0c;它作为系统的入口&#xff0c;负责接收所有的客户端请求…

Shiro高级及SaaS-HRM的认证授权

Shiro高级及SaaS-HRM的认证授权 Shiro在SpringBoot工程的应用 Apache Shiro是一个功能强大、灵活的&#xff0c;开源的安全框架。它可以干净利落地处理身份验证、授权、企业会话管理和加密。越来越多的企业使用Shiro作为项目的安全框架&#xff0c;保证项目的平稳运行。 在之…

前端042_图表展现_自适应

自适应 当缩小窗口时,饼图和柱状图不会自动自适应,会被遮挡住。因为 ECharts 本身并不是自适应的,当你父级容器的宽度发生变化的时候需要手动调用它的 .resize() 方法。 其中 vue-element-admin项目中已经实现了自适应效果,只要将对应代码拷贝引用即可。将 vue-element-adm…

Java中的this、package、import

this 在Java中&#xff0c;this的作用和其词义很接近。 它在方法内部使用&#xff0c;即这个方法所属对象的引用&#xff1b; 它在构造器内部使用&#xff0c;表示该构造器正在初始化的对象。 this 可以调用类的属性、方法和构造器 什么时候使用this关键字呢&#xff…

使用kettle进行日志分析

分析日志是一个大数据分析中较为常见的场景。在Unix类操作系统里&#xff0c;Syslog广泛被应用于系统或者应用的日志记录中。Syslog通常被记录在本地文件内&#xff0c;比如Ubuntu内为/var/log/syslog文件名&#xff0c;也可以被发送给远程Syslog服务器。Syslog日志内一般包括产…