PageRenderTime 26ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/org/rajivprab/sandbox/dish_satisfaction/DishSatisfaction.java

https://gitlab.com/whacks/sandbox
Java | 37 lines | 24 code | 10 blank | 3 comment | 3 complexity | e48741c573c4d1ec52a4b9b1fdaf9454 MD5 | raw file
  1. package org.rajivprab.sandbox.dish_satisfaction;
  2. import com.google.common.collect.ImmutableList;
  3. import com.google.common.collect.Lists;
  4. import com.google.common.collect.Ordering;
  5. import org.apache.commons.lang3.Validate;
  6. import java.util.Collections;
  7. import java.util.List;
  8. // https://leetcode.com/problems/reducing-dishes/
  9. public class DishSatisfaction {
  10. // For more efficient solution, see: https://leetcode.com/problems/reducing-dishes/discuss/563384/JavaC%2B%2BPython-Easy-and-Concise
  11. static int maxSatisfaction(List<Integer> dishSatisfaction) {
  12. List<Integer> copy = Lists.newArrayList(dishSatisfaction);
  13. Collections.sort(copy);
  14. return maxSatisfaction(ImmutableList.copyOf(copy), 0, 0);
  15. }
  16. private static int maxSatisfaction(List<Integer> dishSatisfaction, int timeSpentSoFar, int startingDish) {
  17. if (dishSatisfaction.size() == startingDish) { return 0; }
  18. // Remove validation if trying to improve performance
  19. Validate.isTrue(Ordering.natural().isOrdered(dishSatisfaction), "Dishes are not sorted: %s", dishSatisfaction);
  20. int cur = dishSatisfaction.get(startingDish);
  21. int scoreWithDishCooked = (timeSpentSoFar + 1) * cur +
  22. maxSatisfaction(dishSatisfaction, timeSpentSoFar + 1, startingDish + 1);
  23. if (cur >= 0) { return scoreWithDishCooked; }
  24. int scoreWithoutDishCooked = maxSatisfaction(dishSatisfaction, timeSpentSoFar, startingDish + 1);
  25. return Math.max(scoreWithDishCooked, scoreWithoutDishCooked);
  26. }
  27. }