Find the Minimum Amount of Time to Brew Potions

Medium
Watch on YouTube ↗

Solution

class Solution {
    public long minTime(int[] wizard, int[] potions) {
        int n = wizard.length;
        int m = potions.length;

        long prev[] = new long[n]; // total time taken 
        
        prev[0] = potions[0] * wizard[0];

        for(int i=1; i<n; i++) {
            prev[i] = prev[i-1] + potions[0]*wizard[i];
        }

        // for each potion calculate and update prev array
        for(int i=1; i<m; i++) {
            // how much absolute time each wizard will take to brew this
            long timetaken[] = new long[n];

            long presum[] = new long[n];

            long maxtimetostart = prev[0];

            for(int j=0; j<n; j++) {
                int time = potions[i]*wizard[j];

                timetaken[j] = time;
                presum[j] = j==0 ? time : presum[j-1] + time;

                maxtimetostart = j==0 ? maxtimetostart : Math.max(maxtimetostart, prev[j]-presum[j-1]);
            }

            // updating the prev array - time taken in total
            prev[0] = maxtimetostart + timetaken[0];
            for(int j=1; j<n; j++) {
                prev[j] = prev[j-1] + timetaken[j];
            }
        }

        return prev[n-1];

    }
}
/*

potions = [5,1,4,2]



for potion 5, time taken = 5*1 + 5*5 + 2*5 +4*5 = 60 secs

maxtime = 5

*/