Leetcode Candy

OpenSoucre發表於2014-07-08

There are N children standing in a line. Each child is assigned a rating value.

You are giving candies to these children subjected to the following requirements:

  • Each child must have at least one candy.
  • Children with a higher rating get more candies than their neighbors.

What is the minimum candies you must give?

題目的意思:

  有N個孩子站成一條線,每個孩子分配一個排名。你將要給這些孩子一些糖果,要求:

  • 每個孩子必須至少有一個糖果
  • 孩子如果有個高排名,將得到糖果比其鄰居的多

解題思路是:

  (1)由於每個小孩至少有一個糖果,故將每個小孩的初始糖果初始化為1

  (2)從前往後掃描,如果第i個小孩排名比第i-1高,那麼第i個小孩的糖果數目+1

  (3)從後往前掃描,如果第i個小孩排名比第i+1高,那麼第i個小孩的糖果數目=max(第i個小孩的糖果數目,第i+1個小孩的糖果數目+1)

  (4)最後將所有小孩的糖果數目累積即可

class Solution {
public:
    int candy(vector<int> &ratings) {
        vector<int> candy(ratings.size(),1);
        for(int i = 1; i < ratings.size(); ++ i){
            if(ratings[i]>ratings[i-1]) candy[i]=candy[i-1]+1;
        }
        for(int i = ratings.size()-2; i>=0; -- i){
            if(ratings[i] > ratings[i+1]) candy[i] = max(candy[i+1]+1,candy[i]);
        }
        return accumulate(candy.begin(),candy.end(),0);
    }
};

 

關於此題目類似的題目

  在一維陣列中,找出一個點,使得其所有左邊的數字均小於等於它,所有右邊的數字都大於等於它。要求線上性時間內返回這個點所在的下標。

如A={1,0,1,0,1,2,3},返回下標4或5

解題思路與上面類似

  首先,從左到右掃描一遍陣列,通過一個輔助布林陣列記錄哪些大於等於其之前所有元素的元素;

  其次,從右到左掃描一遍陣列,如果其後所有元素大於等於當前元素,而且在第一個遍歷時當前元素大於等於之前的所有元素,則程式返回下標;

 

int getMagnitutePole(vector<int> A){
    if(A.size() == 0) return 0;
    vector<bool> flag(A.size(), false);
    int curMax = A[0];
    for(int i = 0 ; i <  A.size(); ++ i){
        if(A[i]>=curMax){
            curMax = A[i];
            flag[i] = true;
        }
    }
    int curMin = A[A.size()-1];
    for(int i = A.size()-1; i >=0; -- i ){
        if(A[i] <= curMin){
            curMin = A[i];
            if(flag[i]) return i;
        }
    }
    return -1;
}

 

 

 

相關文章