【LeetCode】1954. 收集足够苹果的最小花园周长

83 阅读1分钟

题目链接

image.png

周长 = 边长 * 4

image.png

image.png

image.png

Python3

方法 1 :枚举 O(m的根号3),O(1)\lgroup O(m的根号3次), O(1) \rgroup

image.png

class Solution:
    def minimumPerimeter(self, neededApples: int) -> int:
        n = 1
        while 2 * n * (n + 1) * (2 * n + 1) < neededApples:
            n += 1
        return 8 * n   #  (n, n)为 右上角 坐标 n * 2 * 4

image.png

方法 2 :二分查找 O(logm),O(1)\lgroup O(\log m), O(1) \rgroup

image.png

class Solution:
    def minimumPerimeter(self, neededApples: int) -> int:
        left, right, res = 0, 100000, 0
        while left <= right:
            mid = left + (right - left)//2
            if 2 * mid * (mid + 1) * (2 * mid + 1) >= neededApples:
                res = mid 
                right = mid - 1
            else:
                left = mid + 1
        return res * 8

image.png

C++

方法: 二分查找 O(logm),O(1)\lgroup O(\log m), O(1) \rgroup

class Solution {
public:
    long long minimumPerimeter(long long neededApples) {
        long long left = 1, right = 100000, res = 0;
        while (left <= right){
            long long mid = (left + right)/2;
            if (2 * mid * (mid + 1) * (2 * mid + 1) >= neededApples){
                res = mid;
                right = mid - 1;
            }
            else{
                left = mid + 1;
            }
        }
        return res * 8;
    }
};