1. 程式人生 > 其它 >【LeetCode】NO.135 分發糖果 (C++ & Python) [貪心演算法]

【LeetCode】NO.135 分發糖果 (C++ & Python) [貪心演算法]

貪心演算法第六彈!!!

題目

n 個孩子站成一排。給你一個整數陣列 ratings 表示每個孩子的評分。

你需要按照以下要求,給這些孩子分發糖果:

每個孩子至少分配到 1 個糖果。
相鄰兩個孩子評分更高的孩子會獲得更多的糖果。

請你給每個孩子分發糖果,計算並返回需要準備的 最少糖果數目 。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/candy
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

思路

  1. 首先想到的是每次考慮左右,但是這樣又跟下一個產生聯絡,很難實現;
  2. 其次考慮從左到右保證右邊孩子大於左邊
    在從後往前考慮左邊孩子要大於右邊
  3. 一開始初始化ans 為全1,保證每個孩子都有
    從左到右索引從1開始,保證i-1取得到;直到遍歷完最後一個;
    從右向左遍歷,要保證ratings[i+1]不越界,從len(ratings)-2,開始(-1是最後一個元素下標)到0(由於range()左閉右開,所以到0,每次-1)

程式碼

Python 版本:


class Solution:
    def candy(self, ratings: List[int]) -> int:
        li = [1]*len(ratings)
        for i in range(1,len(ratings)):
            if ratings[i]>ratings[i-1]:
                li[i] = li[i-1]+1
        for i in range(len(ratings)-2,-1,-1):
            if ratings[i]>ratings[i+1]:
                li[i] = max(li[i],li[i+1]+1)
        return sum(li)

C++ 版本:

class Solution {
public:
    int candy(vector<int>& ratings) {
        vector<int> ans(ratings.size(),1);
        int sum = 0;
        for(int i=1;i<ratings.size();i++)
        {
            if (ratings[i]>ratings[i-1])
            {
                ans[i] = ans[i-1] + 1;
            }

        }
        for(int i=ratings.size()-2;i>=0;i--)
        {
            if (ratings[i]>ratings[i+1])
            {
                ans[i] = max(ans[i],ans[i+1]+1);
            }
        }
        for(int i=0;i<ratings.size();i++)
        {
            sum += ans[i];
        }
        return sum; 
    }
    
};

本文來自部落格園,作者:jucw,轉載請註明原文連結:https://www.cnblogs.com/Jucw/p/15738066.html