算法每日一题:收集足够苹果的最小花园周长 | 数学公式

今天的题目并不是很难,只要推断出一个数学公式来就可以了
需要注意的是,要好好读题和画图,要不很容易就会陷入误区

题目:leetcode 1954
给你一个用无限二维网格表示的花园,每一个 整数坐标处都有一棵苹果树。整数坐标 (i, j) 处的苹果树有 |i| + |j| 个苹果。
你将会买下正中心坐标是 (0, 0) 的一块 正方形土地 ,且每条边都与两条坐标轴之一平行。
给你一个整数 neededApples ,请你返回土地的 最小周长 ,使得 至少 有** **neededApples 个苹果在土地 里面或者边缘上
|x| 的值定义为:

  • 如果 x >= 0 ,那么值为 x
  • 如果 x < 0 ,那么值为 -x
    示例:
    示例 1:
    算法每日一题:收集足够苹果的最小花园周长 | 数学公式_第1张图片
输入:neededApples = 1
输出:8
解释:边长长度为 1 的正方形不包含任何苹果。
但是边长为 2 的正方形包含 12 个苹果(如上图所示)。
周长为 2 * 4 = 8 。

示例 2:

输入:neededApples = 13
输出:16

示例 3:

输入:neededApples = 1000000000
输出:5040

提示:

  • 1 <= neededApples <= 1015

分析:
算法每日一题:收集足够苹果的最小花园周长 | 数学公式_第2张图片
题解:

class Solution {
    public long minimumPerimeter(long neededApples) {
        long n = 1;
        while (2 * n * (n + 1) * (2 * n + 1) < neededApples) {
            n++;
        }
        return n * 8;
    }
}

优化:
4nnn < 2 * n * (n + 1) * (2 * n + 1) < 4(n + 1)(n + 1)(n + 1) < neededApples
其实就是将遍历的范围缩小了一大波

class Solution {
    public long minimumPerimeter(long neededApples) {
        long n = (long) Math.cbrt(neededApples / 4.0);
        if (2 * n * (n + 1) * (2 * n + 1) < neededApples) {
            n++;
        }
        return 8 * n;
    }
}

注意:常用数学函数

pow,sqrt,cbrt,hypot函数

pow(x,y) 计算x^y的值

sqrt(x) 计算x的平方根

cbrt(x) 计算x的立方根

hypot(x,y) 计算(x2+y2)的平方根,常用于计算三角形的斜边长

fabs(x) 计算 x(高精度的double,float)的绝对值

abs(x) 计算 x(整数)的绝对值

你可能感兴趣的:(算法)