LeetCode - 1552 两球之间的磁力

news2024/12/28 11:08:12

目录

题目来源

题目描述

示例

提示

题目解析

算法源码


题目来源

1552. 两球之间的磁力 - 力扣(LeetCode)

题目描述

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

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

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

示例

输入position = [1,2,3,4,7], m = 3
输出3
说明将 3 个球分别放入位于 1,4 和 7 的三个篮子,两球间的磁力分别为 [3, 3, 6]。最小磁力为 3 。我们没办法让最小磁力大于 3 。
输入position = [5,4,3,2,1,1000000000], m = 2
输出999999999
说明我们使用位于 1 和 1000000000 的篮子时最小磁力最大。

提示

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

题目解析

本题是最小值最大化问题,可以使用二分法求解。

本题描述中说

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

则可以得出,磁力 = 距离,即距离越大,磁力越大。

本题需要将m个球放到n个篮子中,如果按照求组合的策略,则会得出种放置方式,每种放置方式的两两相邻球之间都有一个磁力,假设:

  • 放置方式1的两两相邻球之间的磁力的最小值为a
  • 放置方式2的两两相邻球之间的磁力的最小值为b
  • ...
  • 放置方式X的两两相邻球之间的磁力的最小值为x

那么本题的题解就是 max(a, b, ..., x)。即求最大的最小磁力。

本题如果用求组合的策略来求解最大的最小磁力的话,则会超时。最佳策略是用二分。

 

由于题目已经给定了n个篮子的位置position,我们将position进行升序,则可得出:

  • 两球之间的磁力最大值 = position[n-1] - postion[0]

而两球之间的磁力至少为1。

本题中磁力就是距离,因此我们就有了两球之间距离的最小值min:1,和最大值max:position[n-1] - postion[0]

接下来就可以用二分策略,求得一个中间值mid = (min + max) / 2,然后将mid值作为两球之间的最小间距dis,如果有放置策略可以满足所有两两相邻球之间的距离都大于等于dis,则dis就是本题的一个可能解。

具体检查是否满足的逻辑如下:

首先,我们肯定可以放下第一个球,且第一个球的最佳放置位置就是position[0]。

我们记录:

  • 最新放球位置 curPos = position[0]
  • 已放置球个数 count = 1

接下来,我们从 i = 1 开始遍历,到 i = n - 1结束:

  • 如果position[i] - curPos >= dis,则说明将下一个球放到position[i]位置,可以满足最小间距dis的条件,此时count++,且更新curPos = position[i]
  • 如果position[i] - curPos < dis,则说明下一个球不能放到position[i]位置,此时我们只能 i ++ 

遍历结束时:

  • 如果count >= m,则说明m个球都能够在满足两两之间最小间距dis的情况下放到n个篮子中,此时dis就是一个可能解,但不一定时最优解,我们记录此时的dis后,尝试增大二分范围左边界,即min = mid + 1后,继续求中间值mid
  • 如果count < m,则说明m个球不能在满足两两之间最小间距dis的情况下放到n个篮子中,则说明当前dis大了,我们应该缩小dis,即减少二分范围的右边界,即max = mid - 1,继续求中间mid

Java算法源码

class Solution {
    public int maxDistance(int[] position, int m) {
        Arrays.sort(position);

        int minDis = 0;
        int maxDis = position[position.length-1] - position[0];
        int ans = 0;

        while(minDis <= maxDis) {
            int mid = (minDis + maxDis) >> 1;
            if(check(position, m, mid)) {
                ans = mid;
                minDis = mid + 1;
            } else {
                maxDis = mid - 1;
            }
        }

        return ans;
    }

    public boolean check(int[] position, int m, int dis) {
        int count = 1;
        int curPos = position[0];

        for(int i=1; i<position.length; i++) {
            if(position[i] - curPos >= dis) {
                count++;
                curPos = position[i];
            }
        }

        return count >= m;
    }
}

JavaScript算法源码

/**
 * @param {number[]} position
 * @param {number} m
 * @return {number}
 */
var maxDistance = function(position, m) {
    position.sort((a,b)=>a-b)

    let minDis = 1
    let maxDis = position.at(-1) - position[0]
    let ans = 0

    while(minDis <= maxDis) {
        const mid = (minDis + maxDis) >> 1

        if(check(position, m, mid)) {
            ans = mid
            minDis = mid + 1
        } else {
            maxDis = mid - 1
        }
    }

    return ans
};

function check(position, m, dis) {
    let count = 1
    let curPos = position[0]

    for(let i=1; i<position.length; i++) {
        if(position[i] - curPos >= dis) {
            count++;
            curPos = position[i]
        }
    }

    return count >= m
}

Python算法源码

class Solution(object):
    def maxDistance(self, position, m):
        """
        :type position: List[int]
        :type m: int
        :rtype: int
        """
        position.sort()

        minDis = 1
        maxDis = position[-1] - position[0]
        ans = 0

        while minDis <= maxDis:
            mid = (minDis + maxDis) >> 1
            if(self.check(position, m, mid)):
                ans = mid
                minDis = mid + 1
            else:
                maxDis = mid - 1
        
        return ans
    
    def check(self, position, m, dis):
        count = 1
        curPos = position[0]

        for i in range(1, len(position)):
            if position[i] - curPos >= dis:
                count += 1
                curPos = position[i]
        
        return count >= m

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

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

相关文章

二维各向同性介质弹性波数值模拟(交错网格有限差分法)

一、一阶速度-应力弹性波方程 在二维各向同介质xoz平面内&#xff0c;假定体力为0。 从上面方程当中&#xff0c;我们为了得到各点的应力和速度值&#xff0c;就需要得到关于对时间t和空间x&#xff0c;z的偏导。 二、时间上的2M阶差分 由Taylor公式得 三、空间2N阶近似差分…

知识推理——CNN模型总结(持续更新)

记录一下我看过的利用CNN实现知识推理的论文。 最后修改时间&#xff1a;2023.05.10 目录 1.ConvE 1.1.解决的问题 1.2.优势 1.3.贡献与创新点 1.4.方法 1.4.1 为什么用二维卷积&#xff0c;而不是一维卷积&#xff1f; 1.4.2.ConvE具体实现 1.4.3.1-N scoring 1.5.…

RK3568平台开发系列讲解(驱动基础篇)GPIO控制方式

🚀返回专栏总目录 文章目录 一、使用GPIO sysfs接口控制IO二、使用libgpiod控制IO沉淀、分享、成长,让自己和他人都能有所收获!😄 📢GPIO是 General Purpose I/O 的缩写,即通用输入输出端口,简单来说就是MCU/CPU可控制的引脚, 这些引脚通常有多种功能,最基本的是高…

3D点云在线查看利器【LasViewer】

LasViewer是一个免费的3D点云在线查看工具&#xff0c;支持LAS/LAZ格式的3D点云文件在浏览器中的直接渲染。访问地址&#xff1a;LasViewer。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 1、LasViewer快速上手 和BimAnt的其他在线工具一样&#xff0c;LasViewer的…

Windows11使用Cpython 编译文件 报错 error: Unable to find vcvarsall.bat 完美解决方法

开发环境说明&#xff1a; python 3.6.2Vs studio 2017 (已经安装C桌面开发&#xff09; 我的 vcvarsall.bat 路径为&#xff1a; "D:\vsstudio\VC\Auxiliary\Build\vcvarsall.bat" 一般在Vs studio 的此安装路径下 修改python源代码 修改文件为 python3.6.2\Li…

shell脚本练习题

名为lianxi.txt的文件内容如下&#xff1a; Steve Blenheim:238-923-7366:95 Latham Lane, Easton, PA 83755:11/12/56:20300 Betty Boop:245-836-8357:635 Cutesy Lane, Hollywood, CA 91464:6/23/23:14500 Igor Chevsky:385-375-8395:3567 Populus Place, Caldwell, NJ 2387…

[230516] TPO71 | 2022年托福阅读真题第4/36篇 | Electrical Energy from the Ocean | 11:50

目录 7101 Electrical Energy from the Ocean Paragraph 1 问题1 Paragraph 2 问题2 Paragraph 3 问题3 Paragraph 4 问题4 做错 Paragraph 5 问题5 做错 Paragraph 6 问题6 Paragraph 7 问题7 Paragaph 8 问题8 做错 Paragraph 2 问题9 问题10 7101…

GateWay源码解析

前言 一、GateWay的自动配置 springboot 在引入一个新的组件时&#xff0c;一般都会有对应的XxxAutoConfiguration类来对该组件进行配置&#xff0c;GateWay也不例外&#xff0c;在引入了以下配置后&#xff0c;就会生成对应的GatewayAutoConfiguration自动配置类 <!-- gat…

15.Python Package目录及打包并发布到PyPI

欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 文章目录 0.基本介绍1.__init__.py文件1.1 Regular Package1.2 namespace package 2.Python Package工程2.1 安装及打包并发布到pypi2.2 将Python文件编译成.so 3.包的搜索路径参考资料 0.基…

go test coverage 单测覆盖率

单元测试的最终统计标准就是单测覆盖率&#xff0c;统计单测总体覆盖了多少行代码。一般来说&#xff0c;我们只需要关注增量代码的覆盖率&#xff0c;而非全量代码。增量代码就是本次迭代改动的代码&#xff0c;比如本次迭代改动了100行代码&#xff0c;我们保证单测能覆盖到这…

【Vue工程】007-Scss

【Vue工程】007-Scss 文章目录 【Vue工程】007-Scss一、概述1、CSS 问题三大缺点CSS 预处理器 2、简介3、中文网4、Slogan 二、基本使用1、安装2、配置全局 scss 样式文件3、在 vite.config.ts 配置4、组件中使用5、访问 http://localhost:5173/home 一、概述 1、CSS 问题 参考…

【OJ比赛日历】快周末了,不来一场比赛吗? #05.13-05.19 #14场

CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号同时会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 更多比赛信息见 CompHub主页 或 点击文末阅读原文 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-05-…

AC AP简单组网

AC AP简单组网 1、LSW1交换机配置2、AC1控制器配置3、初步效果查看3.1、查看PC1获取地址情况3.2、查看AP获取地址情况 4、AC1控制器配置组网5、组网成功验收5.1、查看AP的物理地址&#xff08;dis arp)5.2、ensp模拟的拓扑结果5.3、STA链接到AP网络5.3、查看STA地址及连通性 vl…

ChatGPT:讯飞星火认知大模型-科大讯飞

讯飞星火认知大模型 科大讯飞推出的新一代认知智能大模型&#xff0c;拥有跨领域的知识和语言理解能力&#xff0c;能够基于自然对话方式理解与执行任务。从海量数据和大规模知识中持续进化&#xff0c;实现从提出、规划到解决问题的全流程闭环。 进入科大讯飞官网点击注册 …

【枚举+数学】CF1781D Many Perfect Squares

Many Perfect Squares - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意&#xff1a; 思路&#xff1a; n&#xff0c;1~50&#xff1a;对n暴力 x&#xff0c;0~1e18&#xff1a;O(1)计算 完全平方数&#xff1a;p^2 Code&#xff1a; #include <bits/stdc.h>#de…

liunx将普通用户提升为管理员

场景 用户要求将账号设置为管理员 操作如下 先登录服务器用管理员账号 打开配置文件/etc/sudoers 此时你会发现文件是空的&#xff0c;为什么呢&#xff1f;原因如下 因为当时使用的是管理员账号 需要切换成root才可以修改此文件 命令sudo su - 操作见图片 操作完之后 用户…

深入浅出解析 JVM 中的 Safepoint

1. 初识 Safepoint-GC 中的 Safepoint 最早接触 JVM 中的安全点概念是在读《深入理解 Java 虚拟机》那本书垃圾回收器章节的内容时。相信大部分人也一样&#xff0c;都是通过这样的方式第一次对安全点有了初步认识。不妨&#xff0c;先复习一下《深入理解 Java 虚拟机》书中安…

初识Linux篇:第二篇

初识Linux&#xff1a;第二篇 初识Linux&#xff1a;第二篇1.操作系统2.命令行3.Linux的基本指令3.1.ls指令3.2pwd指令3.3cd指令3.4touch指令3.5mkdir指令3.6.rmdir指令 && rm 指令 4.yum中有趣的程序4.1小火车4.2牛4.3Linux_logo(企鹅)4.4在Linux上打开网页 总结 初识…

【Spring全家桶与Mybatis】Spring环境下整合Mybatis(纯注解方式)

⭐️前面的话⭐️ 本文已经收录到《Spring框架全家桶系列》专栏&#xff0c;本文将介绍在Spring环境下整合mybatis。 &#x1f4d2;博客主页&#xff1a;未见花闻的博客主页 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4cc;本文…

520快给你喜欢的女生发个表白软件吧!【手把手教学】

文章目录 项目介绍一、创建项目二、设计窗体三、添加事件总结 项目介绍 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 开发工具&#xff1a;Visual Studio 2022 本项目是用C# Winform开发的一个小软件。 实现非常简单&#xff0c;下面看一下这个软件运行…