【LeetCode】5638.吃蘋果的最大數目
阿新 • • 發佈:2020-12-27
題目連結
5638. 吃蘋果的最大數目
題目描述
解題思路
貪心+優先佇列
就和平時吃零食一樣,優先把快過期的零食吃完,同理,在本題中優先吃那些即將過期的蘋果.
如何才能知道現在那些蘋果最快就要過期,這些快要過期的蘋果又還剩餘幾個呢??
利用優先佇列,佇列中儲存的就是一個二維陣列,[蘋果數目,蘋果過期時間].
AC程式碼
class Solution { public int eatenApples(int[] apples, int[] days) { Queue<int[]> q = new PriorityQueue<>(new Comparator<int[]>(){ public int compare(int[] i1,int[] i2){ return i1[1] - i2[1]; } }); int ans = 0; for(int i = 0; i < apples.length; i++){ //1.清理蘋果剩餘為0以及過期蘋果 while(!q.isEmpty()){ int[] temp = q.peek(); if(temp[0] <= 0 || temp[1] < i){ q.poll(); }else break; } //2.添加當天新長出的蘋果,如果當天蘋果數為0,則跳過 if(apples[i] > 0){ int pair[] = new int[2]; pair[0] = apples[i]; pair[1] = i + days[i] - 1; q.offer(pair); } //3.優先吃最早過期的. int temp[] = q.peek(); if(temp != null){ temp[0]--; ans++; } } //優先佇列中還存在著元素,接著吃蘋果.value代表當前天數 int value = apples.length; while(!q.isEmpty()){ int temp[] = q.peek(); if(temp[0] == 0 || temp[1] < value){ q.poll(); }else{ temp[0]--; ans++; value++; } } return ans; } }