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

news2024/10/2 3:21:49

【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

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

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

相关文章

关于“Python”的核心知识点整理大全39

目录 ​编辑 14.1.5 将 Play 按钮切换到非活动状态 game_functions.py 14.1.6 隐藏光标 game_functions.py game_functions.py 14.2 提高等级 14.2.1 修改速度设置 settings.py settings.py settings.py game_functions.py 14.2.2 重置速度 game_functions.py 1…

【动态规划算法】之打家劫舍Ⅱ

2.打家劫舍 II 和上一个比不同的就是&#xff0c;现在房屋围了一圈&#xff0c;第一个和最后一个相连 这道题目和198.打家劫舍 (opens new window)是差不多的&#xff0c;唯一区别就是成环了。 对于一个数组&#xff0c;成环的话主要有如下三种情况&#xff1a; 情况一&…

人工智能:从基础到前沿

人工智能&#xff1a;从基础到前沿 引言 当我们谈论“人工智能”&#xff08;AI&#xff09;时&#xff0c;我们其实是在谈论一个涵盖了众多学科、技术和应用的广阔领域。从计算机视觉到自然语言处理&#xff0c;从机器人学到深度学习&#xff0c;AI已经成为我们生活中不可或…

【OAuth2】授权框架的四种授权方式详解

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《OAuth 2》。&#x1f3af;&#x1f3af; &#x1…

超维空间S2无人机使用说明书——21、VINS视觉定位仿真

引言&#xff1a;为了实现室内无人机的定位功能&#xff0c;S系列无人机配置了VINS-FUSION定位环境&#xff0c;主要包含了仿真跑数据集和实际操作部分。为了提前熟悉使用原理&#xff0c;可以先使用仿真环境跑数据集进行学习和理解 硬件&#xff1a;1080P显示器、Jetson orin…

PYQT的使用入门

上一章节&#xff1a;VSCode安装PYQT5-CSDN博客 QTDesigner初识 vscode导航栏右键&#xff0c;新建ui文件&#xff0c;弹出QT Designer。 完成创建后&#xff0c;可以在新窗口中进行UI布局。 QTDesigner左侧为组件库&#xff0c;中间为UI布局界面&#xff0c;右侧分别为对象…

Anylogic Pro 8.8.x for Mac / for Linux Crack

Digital twins – a step towards a digital enterprise AnyLogic是唯一一个支持创建模拟模型的方法的模拟建模工具&#xff1a;面向过程&#xff08;离散事件&#xff09;、系统动态和代理&#xff0c;以及它们的任何组合。AnyLogic提供的建模语言的独特性、灵活性和强大性使…

Redis数据库——键空间

一.服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中&#xff0c;db数组的每一个项都是一个redis.h/redisDb结构&#xff0c;每一个RedisDb结构代表一个数据库。 在初始化服务器时&#xff0c;程序会根据服务器状态的dbnum属性来…

喷淋实验--嵌入式实训

喷淋实验--嵌入式实训 1.MQTT通信原理 采集信息&#xff1a; 小程序/Linux 订阅者 1703161172612/AIOTSIM2APP 元宇宙 发布者 1703161172612/AIOTSIM2APP Linux订阅的主题是元宇宙发布的主题 控制设备&#xff1a; 小程序/Linux 发布者 1703161172612/APP2AIOTSIM 元宇宙 订阅者…

java并发编程八 CAS 与 volatile和原子整数与原子引用

文章目录 CAS 与 volatile慢动作分析volatile为什么无锁效率高CAS 的特点 原子整数原子引用不安全实现安全实现-使用锁安全实现-使用 CAS CAS 与 volatile 在java并发编程七六中&#xff0c;可以看到的 AtomicInteger 的解决方法&#xff0c;内部并没有用锁来保护共享变量的线…

前端扫盲:什么是API网关?为什么它有用?

API 通常被称为应用程序从后端服务访问数据和业务逻辑的前门。API 本质上是一个软件向其他人或程序提供的接口&#xff0c;允许他们与该软件进行交互。 在创建 API 时&#xff0c;需要选择编程语言(Java、Python、PHP 等)来编写 API 逻辑&#xff0c;还需要将 API 部署到服务器…

前端项目为什么需要 TypeScript 来强化?

什么是TypeScript? TypeScript 是一个为开发大规模应用程序而设计的语言。它是 JavaScript 的一个超集&#xff0c;包含 JavaScript 全部的功能&#xff0c;并扩展了一些新的特性。具体来说&#xff0c;TypeScript 增加了如类型注解和编译时类型检查等特性&#xff1a; let n…

制作自己的 Docker 容器

软件开发最大的麻烦事之一&#xff0c;就是环境配置。用户必须保证操作系统的设置&#xff0c;各种库和组件的安装&#xff0c;只有它们都正确&#xff0c;软件才能运行。docker从根本上解决问题&#xff0c;软件安装的时候&#xff0c;把原始环境一模一样地复制过来。 以 koa-…

分布式事务三阶段提交3PC详解

文章目录 概述工作流程优缺点总结代码样例 概述 3PC 利用超时机制解决了 2PC 同步阻塞问题&#xff0c;避免资源被永久锁定&#xff0c;进一步加强了整个事务过程可靠性。但 3PC 同样无法应对类似宕机问题&#xff0c;只不过出现多数据源中数据不一致问题概率更小。 a. 概念&a…

Python中json模块的使用与pyecharts绘图的基本介绍

文章目录 json模块json与Python数据的相互转化 pyecharts模块pyecharts基本操作基础折线图配置选项全局配置选项 json模块的数据处理折线图示例示例代码 json模块 json实际上是一种数据存储格式&#xff0c;是一种轻量级的数据交互格式&#xff0c;可以把他理解成一个特定格式…

Spark编程实验三:Spark SQL编程

目录 一、目的与要求 二、实验内容 三、实验步骤 1、Spark SQL基本操作 2、编程实现将RDD转换为DataFrame 3、编程实现利用DataFrame读写MySQL的数据 四、结果分析与实验体会 一、目的与要求 1、通过实验掌握Spark SQL的基本编程方法&#xff1b; 2、熟悉RDD到DataFram…

springboot实现发送邮件开箱即用

springboot实现发送邮件开箱即用 环境依赖包yml配置Service层Controller层测试 环境 jdk17 springboot版本3.2.1 依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><ver…

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

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

第11章 GUI Page400~402 步骤二 画直线

运行效果&#xff1a; 源代码&#xff1a; /**************************************************************** Name: wxMyPainterApp.h* Purpose: Defines Application Class* Author: yanzhenxi (3065598272qq.com)* Created: 2023-12-21* Copyright: yanzhen…

《每天一分钟学习C语言·九》引用,指针函数,函数指针等

1、 普通全局变量——作用域是整个源程序&#xff08;含有多个源文件&#xff0c;在各个源文件中都有效&#xff09; static全局变量——作用域在当前源文件 2、 引用 &#xff08;1&#xff09;申明引用的同时必须要初始化 &#xff08;2&#xff09;引用变量是目标变量的一个…