Advertisement
i_love_rao_khushboo

Untitled

Apr 6th, 2025
492
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.99 KB | None | 0 0
  1. // https://leetcode.com/problems/find-the-minimum-amount-of-time-to-brew-potions/description/?envType=company&envId=google&favoriteSlug=google-thirty-days
  2.  
  3. class Solution {
  4.     private boolean isValid(int potionIdx, long startTime, int n, int m, long[] prevEndTime, int[] skill, int[] mana, long[] newEndTime) {
  5.         if (startTime < prevEndTime[0]) {
  6.             return false;
  7.         }
  8.  
  9.         newEndTime[0] = startTime + ((long) skill[0] * mana[potionIdx]);
  10.  
  11.         for (int i = 1; i < n; i++) {
  12.             long newStartTimeForIthWizard = newEndTime[i - 1];
  13.             if (newStartTimeForIthWizard < prevEndTime[i]) {
  14.                 return false;
  15.             } else {
  16.                 newEndTime[i] = newStartTimeForIthWizard + ((long) skill[i] * mana[potionIdx]);
  17.             }
  18.         }
  19.  
  20.         return true;
  21.     }
  22.  
  23.     public long minTime(int[] skill, int[] mana) {
  24.         int n = skill.length; // #wizards
  25.         int m = mana.length; // #potions
  26.  
  27.         long[] endTime = new long[n];
  28.  
  29.         // for 0th potion, time taken by all n wizards
  30.         for (int i = 0; i < n; i++) {
  31.             if (i == 0) {
  32.                 endTime[i] = ((long) skill[i] * mana[0]);
  33.             } else {
  34.                 endTime[i] = endTime[i - 1] + ((long) skill[i] * mana[0]);
  35.             }
  36.         }
  37.  
  38.         for (int potion = 1; potion < m; potion++) {
  39.             long L = endTime[0], R = endTime[n - 1];
  40.             long[] newTentativeEndTime = new long[n];
  41.  
  42.             boolean isValidFound = false;
  43.  
  44.             while (L <= R) {
  45.                 long mid = L + ((R - L) >> 1L);
  46.  
  47.                 if (isValid(potion, mid, n, m, endTime, skill, mana, newTentativeEndTime)) {
  48.                     isValidFound = true;
  49.                     R = mid - 1;
  50.                 } else {
  51.                     L = mid + 1;
  52.                 }
  53.             }
  54.  
  55.             if (isValidFound) {
  56.                 endTime = newTentativeEndTime;
  57.             }
  58.         }
  59.  
  60.         return endTime[n - 1];
  61.     }
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement