LeetCode 1954. 收集足够苹果的最小花园周长:数学O(1)的做法

【LetMeFly】1954.收集足够苹果的最小花园周长:数学O(1)的做法

力扣题目链接:https://leetcode.cn/problems/minimum-garden-perimeter-to-collect-enough-apples/

给你一个用无限二维网格表示的花园,每一个 整数坐标处都有一棵苹果树。整数坐标 (i, j) 处的苹果树有 |i| + |j| 个苹果。

你将会买下正中心坐标是 (0, 0) 的一块 正方形土地 ,且每条边都与两条坐标轴之一平行。

给你一个整数 neededApples ,请你返回土地的 最小周长 ,使得 至少 有 neededApples 个苹果在土地 里面或者边缘上

|x| 的值定义为:

  • 如果 x >= 0 ,那么值为 x
  • 如果 x < 0 ,那么值为 -x

 

示例 1:

输入:neededApples = 1
输出:8
解释:边长长度为 1 的正方形不包含任何苹果。
但是边长为 2 的正方形包含 12 个苹果(如上图所示)。
周长为 2 * 4 = 8 。

示例 2:

输入:neededApples = 13
输出:16

示例 3:

输入:neededApples = 1000000000
输出:5040

 

提示:

  • 1 <= neededApples <= 1015

方法一:求公式

边长为 2 n 2n 2n的正方形,苹果数量为多少呢?

由于X和Y是相互独立的,因此二者可以分开来看。对于X:

边长为 2 n 2n 2n的正方形一共有 2 n + 1 2n+1 2n+1行,每行有Y轴左右共 2 2 2部分。只考虑其中一行Y轴右侧的部分:

对苹果的总贡献数为 0 + 1 + 2 + ⋯ + n = n ( n + 1 ) 2 0+1+2+\cdots+n=\frac{n(n+1)}{2} 0+1+2++n=2n(n+1)

因此所有的X的贡献为 ( 2 n + 1 ) × 2 × n ( n + 1 ) 2 = n ( n + 1 ) ( 2 n + 1 ) (2n+1)\times2\times\frac{n(n+1)}{2}=n(n+1)(2n+1) (2n+1)×2×2n(n+1)=n(n+1)(2n+1)

由于Y与X类似,所以Y的贡献与X相同,因此边长为2n的正方形的苹果数为 2 n ( n + 1 ) ( 2 n + 1 ) 2n(n+1)(2n+1) 2n(n+1)(2n+1)

n n n为多少才能至少有neededApples个苹果呢?

将上式处理一下: 2 n ( n + 1 ) ( 2 n + 1 ) = 4 n ( n + 1 ) ( n + 0.5 ) ≈ 4 n 3 2n(n+1)(2n+1)=4n(n+1)(n+0.5)\approx 4n^3 2n(n+1)(2n+1)=4n(n+1)(n+0.5)4n3并且大于 4 n 3 4n^3 4n3

也就是说要求的 n n n就在 1 4 n e e d e d A p p l e s 3 \sqrt[3]{\frac14neededApples} 341neededApples 附近。令 m = 1 4 n e e d e d A p p l e s 3 m=\sqrt[3]{\frac14neededApples} m=341neededApples ,其实从 ⌊ m ⌋ − 10 \lfloor m\rfloor - 10 m10 ⌊ m ⌋ + 10 \lfloor m\rfloor+10 m+10算一遍就直到答案了。

有没有更靠谱/可信一点的证明? (此部分可跳过)

n = ⌊ m ⌋ n=\lfloor m\rfloor n=m,令 f ( n ) = n ( n + 1 ) ( n + 0.5 ) f(n)=n(n+1)(n+0.5) f(n)=n(n+1)(n+0.5),则是在求最小的 n n n使得 f ( n ) ≥ 1 4 n e e d e d A p p l e s f(n)\geq \frac14neededApples f(n)41neededApples。因为有:

  1. f ( n − 1 ) = ( n − 1 ) n ( n − 0.5 ) < n 3 ≤ m 3 = 1 4 n e e d e d A p p l e s f(n-1)=(n-1)n(n-0.5)\lt n^3\leq m^3=\frac14neededApples f(n1)=(n1)n(n0.5)<n3m3=41neededApples,因此 n − 1 n-1 n1必定偏小
  2. f ( n + 1 ) = ( n + 1 ) ( n + 2 ) ( n + 1.5 ) > ( n + 1 ) 3 = ⌈ m ⌉ 3 > 1 4 n e e d e d A p p l e s f(n+1)=(n+1)(n+2)(n+1.5)\gt (n+1)^3=\lceil m\rceil^3\gt \frac14neededApples f(n+1)=(n+1)(n+2)(n+1.5)>(n+1)3=m3>41neededApples,因此 n + 1 n+1 n+1必定满足要求

所以答案 a n s ans ans的范围是: [ n , n + 1 ] [n, n+1] [n,n+1],其中 n = ⌊ m ⌋ = ⌊ 1 4 n e e d e d A p p l e s 3 ⌋ n=\lfloor m\rfloor=\lfloor \sqrt[3]{\frac14neededApples}\rfloor n=m=341neededApples

因此只需要先计算出 ⌊ 1 4 n e e d e d A p p l e s 3 ⌋ \lfloor \sqrt[3]{\frac14neededApples}\rfloor 341neededApples ,并在不满足要求(苹果数偏少)时不断加加一,直到满足要求即可。(最多会加1次一)

  • 时间复杂度 O ( 1 ) O(1) O(1),开立方根有内置库,可视为 O ( 1 ) O(1) O(1)时间复杂度
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++
/*
x: 2(2n+1)(1+2+...+n)=n(n+1)(2n+1)
y = x
x + y: 2n(n+1)(2n+1) = 4n(n+1)(n+0.5)≈4n^3
*/
class Solution {
public:
    long long minimumPerimeter(long long neededApples) {
        long long ans = cbrt((double)0.25 * neededApples);
        while (2 * ans * (ans + 1) * (2 * ans + 1) <  neededApples) {
            ans++;
        }
        return ans * 8;
    }
};
Python
# from numpy import cbrt

class Solution:
    def minimumPerimeter(self, neededApples: int) -> int:
        ans = int(cbrt(0.25 * neededApples))
        while 2 * ans * (ans + 1) * (2 * ans + 1) < neededApples:
            ans += 1
        return ans * 8

同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/135183907

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DRF之初识

一、序列化和反序列化 api接口开发&#xff0c;最核心最常见的一个过程就是序列化 【1】序列化 把我们能识别的数据结构(python的字典&#xff0c;列表&#xff0c;对象)转换成其他语言(程序)能识别的数据结构。例如&#xff1a; 我们在django中获取到的数据默认是模型对象(…

【论文解读】3D视觉标定的显式文本解耦和密集对齐(CVPR 2023)

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/abs/2209.14941 开源代码&#xff1a;https://github.com/yanmin-wu/EDA 图1所示。文本解耦&#xff0c;密集对齐的3D视觉标定。文本中的不同颜色对应不同的解耦分量。…

Windows 11中显示文件扩展名的方法与Windows 10大同小异,但前者更人性化

默认情况下&#xff0c;Windows 11会隐藏已知文件类型的文件扩展名。这可能会使在不首先打开文件的情况下很难识别文件类型。 幸运的是&#xff0c;你可以将Windows 11配置为显示已知文件类型的扩展名。该方法类似于Windows 10&#xff0c;但该选项现在组织在下拉菜单中&#…

[kubernetes]控制平面ETCD

什么是ETCD CoreOS基于Raft开发的分布式key-value存储&#xff0c;可用于服务发现、共享配置以及一致性保障&#xff08;如数据库选主、分布式锁等&#xff09;etcd像是专门为集群环境的服务发现和注册而设计&#xff0c;它提供了数据TTL失效、数据改变监视、多值、目录监听、…

cygwin64路径转换小工具

文章目录 cygwin64路径转换小工具改善效果实现函数END cygwin64路径转换小工具 改善 在cygwin64做实验呢, 用VSCODE自己加的cygwin64的启动命令行作为控制台. 如果是一个比较长的windows路径, 输入起来真的烦. 做了一个就几句代码的小工具, 让输入路径时, 可以从工具上拷贝到…

2023.12.22 关于 Redis 数据类型 String 常用命令

目录 引言 String 类型基本概念 SET & GET SET 命令 GET 命令 MSET & MGET MSET 命令 MGET 命令 SETNX & SETEX & PSETEX SETNX 命令 SETEX 命令 PSETEX 命令 计数命令 INCR 命令 INCRBY 命令 DECR 命令 DECRBY 命令 INCRBYFLOAT 命令 总结…

代码随想录27期|Python|Day24|回溯法|理论基础|77.组合

图片来自代码随想录 回溯法题目目录 理论基础 定义 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。 回溯是递归的副产品&#xff0c;只要有递归就会有回溯。回溯函数也就是递归函数&#xff0c;指的都是一个函数。 基本问题 组合问题&#xff08;无序&…

Spring(3)Spring从零到入门 - Spring整合技术及AOP事务管理

Spring&#xff08;3&#xff09;Spring从零到入门 - Spring整合技术及AOP事务管理 文章目录 Spring&#xff08;3&#xff09;Spring从零到入门 - Spring整合技术及AOP事务管理4 Spring整合技术示例4.1 Spring整合Mybatis4.1.1 Mybatis开发回顾4.1.2 整合Spring分析4.1.3 Spri…

AI项目十九:YOLOV8实现目标追踪

若该文为原创文章&#xff0c;转载请注明原文出处。 主要是学习一下实现目标追踪的原理&#xff0c;并测试一下效果。 目的是通过YOLOV8实现人员检测&#xff0c;并实现人员追踪&#xff0c;没个人员给分配一个ID&#xff0c;实现追踪的效果。 也可以统计人数。在小区办公楼…

JavaScript中的prototype和_proto_的关系是什么

JavaScript中的prototype和_proto_的关系是什么 __proto__ 是 JavaScript 中对象的一个内部属性&#xff0c;它指向该对象的原型。JavaScript 中每个对象都有一个 __proto__ 属性&#xff0c;通过它可以访问对象的原型。prototype 是函数对象特有的属性&#xff0c;每个函数都…

5. 创建型模式 - 单例模式

亦称&#xff1a; 单件模式、Singleton 意图 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 问题 单例模式同时解决了两个问题&#xff0c; 所以违反了单一职责原则&#xff1a; 保证一个类只有一…

C语言——关于数据在内存中存储的练习

大家好&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各位→…

gitattributes配置文件的作用

0 Preface/Foreword Git版本管控工具功能强大&#xff0c;在使用过程中&#xff0c;在多人合作的项目开发过程中&#xff0c;经常会遇到提交代码时出现的warning提醒&#xff0c;尤其是换行符。 Linux/Unix/Mac OS操作系统的换行符使用LF符号&#xff08;\n&#xff09;&…

基于python的selenium

一.安装 安装WebDriver 查看chrome版本号&#xff0c;设置-帮助-关于Google chrome&#xff0c;找到版本号。 可以到这个网站进行下载对应版本的chromedriver,如果chrome浏览器版本过高,可以下载最新版的chromedriver进行使用 Chrome for Testing availability 下载下来之后…

(附源码)SSM银行账目管理平台 计算机毕设43684

摘 要 当今社会已进入信息社会时代&#xff0c;信息已经受到社会的广泛关注&#xff0c;被看作社会和科学技术发展的三大支柱(材料,能源,信息)。信息是管理的基础&#xff0c;是进行决策的的基本依据。在一个组织里信息已作为人力,物力,财力之外的第四种能源,占有重要的地位。然…

Simulink元件

constant元件 输出常数/标量 这样我们就只输出了一个常数 输出一维数组/矢量 这样我们就输出了1-5一共5个数字 输出二维数组 这样我们就输出了4个数字 选择框Interpret vector parameters as 1-D 如果标量或者矩阵&#xff0c;勾与不勾都一样。 如果是向量&#xff0c;勾选…

【OAuth2】:赋予用户控制权的安全通行证--原理篇

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于OAuth2的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.什么是OAuth? 二.为什么要用OAuth?…

基于SpringBoot+Vue的办公OA系统

开发环境 IDEA JDK1.8 MySQL8.0Node14.17.0 系统简介 本系统为前后端分离项目&#xff0c;主要拥有两个身份登录系统&#xff0c;管理员可以发布公告等信息&#xff0c;员工登录可以申请请假等信息&#xff0c;系统难度适中&#xff0c;适合学习研究使用&#xff0c;具体请…

python脚本 ssh工具 ssh上传文档 选择文档并上传到ssh服务器

此文分享一个python脚本,用于快速的定位、选择文档,并将其上传到指定的ssh服务器。 效果演示 🔥完整演示效果 👇第一步,显然,我们需要选择功能 👇第二步,我们需要定位并选择需要上传的文档 👇第三步,确认我们需要上传文档的ssh服务器 👇第四步,定位、选择…

机场数据治理系列介绍(2):六图法开展数据治理的步骤与要点

目录 一、机场数据治理的六图法 1、何为六图法 二、应用数据治理六图法的相关工作步骤 1、制定战略目标 2、梳理业务情况 3、收集需求 4、构建数智应用地图 5、选择合适的算法 6、建立数据地图 7、持续改进和优化 三、相关要点 1、明确数据治理三张清单 2、持续构…