Earliest Finish Time for Land and Water Rides I

Easy
Watch on YouTube ↗

Solution

class Solution {

    public int earliestFinishTime(int[] landStart, int[] landDur,
                                  int[] waterStart, int[] waterDur) {

        // O(n + m)
        int bestLandFinish = Integer.MAX_VALUE;
        int bestWaterFinish = Integer.MAX_VALUE;
        int ans = Integer.MAX_VALUE;

        // Earliest possible finish among all land rides.
        for (int i = 0; i < landStart.length; i++) {
            bestLandFinish = Math.min(bestLandFinish, landStart[i] + landDur[i]);
        }

        // Try every water ride after the earliest-finishing land ride.
        for (int i = 0; i < waterStart.length; i++) {
            int finishTime = Math.max(bestLandFinish, waterStart[i]) + waterDur[i];
            ans = Math.min(ans, finishTime);
        }

        // Earliest possible finish among all water rides.
        for (int i = 0; i < waterStart.length; i++) {
            bestWaterFinish = Math.min(bestWaterFinish, waterStart[i] + waterDur[i]);
        }

        // Try every land ride after the earliest-finishing water ride.
        for (int i = 0; i < landStart.length; i++) {
            int finishTime = Math.max(bestWaterFinish, landStart[i]) + landDur[i];
            ans = Math.min(ans, finishTime);
        }

        return ans;
    }
}