LeetCode-in-Java

2136. Earliest Possible Day of Full Bloom

Hard

You have n flower seeds. Every seed must be planted first before it can begin to grow, then bloom. Planting a seed takes time and so does the growth of a seed. You are given two 0-indexed integer arrays plantTime and growTime, of length n each:

From the beginning of day 0, you can plant the seeds in any order.

Return the earliest possible day where all seeds are blooming.

Example 1:

Input: plantTime = [1,4,3], growTime = [2,3,1]

Output: 9

Explanation: The grayed out pots represent planting days, colored pots represent growing days, and the flower represents the day it blooms.

One optimal way is:

On day 0, plant the 0th seed. The seed grows for 2 full days and blooms on day 3.

On days 1, 2, 3, and 4, plant the 1st seed. The seed grows for 3 full days and blooms on day 8.

On days 5, 6, and 7, plant the 2nd seed. The seed grows for 1 full day and blooms on day 9.

Thus, on day 9, all the seeds are blooming.

Example 2:

Input: plantTime = [1,2,3,2], growTime = [2,1,2,1]

Output: 9

Explanation: The grayed out pots represent planting days, colored pots represent growing days, and the flower represents the day it blooms.

One optimal way is:

On day 1, plant the 0th seed. The seed grows for 2 full days and blooms on day 4.

On days 0 and 3, plant the 1st seed. The seed grows for 1 full day and blooms on day 5.

On days 2, 4, and 5, plant the 2nd seed. The seed grows for 2 full days and blooms on day 8.

On days 6 and 7, plant the 3rd seed. The seed grows for 1 full day and blooms on day 9.

Thus, on day 9, all the seeds are blooming.

Example 3:

Input: plantTime = [1], growTime = [1]

Output: 2

Explanation: On day 0, plant the 0th seed. The seed grows for 1 full day and blooms on day 2.

Thus, on day 2, all the seeds are blooming.

Constraints:

Solution

import java.util.Arrays;
import java.util.Collections;

@SuppressWarnings("java:S1210")
public class Solution {
    public int earliestFullBloom(int[] plantTime, int[] growTime) {
        int n = plantTime.length;
        if (n == 1) {
            return plantTime[0] + growTime[0];
        }
        Seed[] arr = new Seed[n];
        for (int i = 0; i < n; i++) {
            arr[i] = new Seed(plantTime[i], growTime[i]);
        }
        Arrays.sort(arr, Collections.reverseOrder());
        int ans = arr[0].plantTime + arr[0].growTime;
        int lastPlantDay = arr[0].plantTime;
        for (int i = 1; i < n; i++) {
            int currBloomDay = lastPlantDay + arr[i].plantTime + arr[i].growTime;
            ans = Math.max(ans, currBloomDay);
            lastPlantDay += arr[i].plantTime;
        }
        return ans;
    }

    static class Seed implements Comparable<Seed> {
        int plantTime;
        int growTime;

        Seed(int plantTime, int growTime) {
            this.plantTime = plantTime;
            this.growTime = growTime;
        }

        public int compareTo(Seed s) {
            return this.growTime - s.growTime;
        }
    }
}