Formatted question description: https://leetcode.ca/all/1954.html

# 1954. Minimum Garden Perimeter to Collect Enough Apples

Medium

## Description

In a garden represented as an infinite 2D grid, there is an apple tree planted at every integer coordinate. The apple tree planted at an integer coordinate (i, j) has |i| + |j| apples growing on it.

You will buy an axis-aligned square plot of land that is centered at (0, 0).

Given an integer neededApples, return the minimum perimeter of a plot such that at least neededApples apples are inside or on the perimeter of that plot.

The value of |x| is defined as:

• x if x >= 0
• -x if x < 0

Example 1: Input: neededApples = 1

Output: 8

Explanation: A square plot of side length 1 does not contain any apples.

However, a square plot of side length 2 has 12 apples inside (as depicted in the image above).

The perimeter is 2 * 4 = 8.

Example 2:

Input: neededApples = 13

Output: 16

Example 3:

Input: neededApples = 1000000000

Output: 5040

Constraints:

• 1 <= neededApples <= 10^15

## Solution

Obviously, the side of the garden must be even. Once the side of the garden is determined, the number of apples in the garden can be calculated. Use binary search to find the minimum garden side to collect enough apples. The perimeter is the garden side multipled by 4.

class Solution {
public long minimumPerimeter(long neededApples) {
long low = 2, high = Math.min(neededApples, 1000000);
if (high % 2 == 1)
high--;
while (low < high) {
long mid = (high - low) / 2 + low;
if (mid % 2 == 1)
mid--;
long apples = countApples(mid);
if (apples < neededApples)
low = mid + 2;
else
high = mid;
}
return low * 4;
}

public long countApples(long side) {
long center = side / 2 * (side / 2 + 1);
long start = center + side + 1;
long end = center + (side + 1) * side / 2;
long total = (start + end) * side / 2 + center;