1. 程式人生 > 實用技巧 >【LeetCode】5638.吃蘋果的最大數目

【LeetCode】5638.吃蘋果的最大數目

題目連結

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;
    }
}