1. 程式人生 > 實用技巧 >1103.分糖果II

1103.分糖果II

原題連結

題解

直接手動模擬過去,時間複雜度為O(n)

程式碼如下

class Solution {
public:
    vector<int> distributeCandies(int candies, int num_people) {
        vector<int> res(num_people, 0);
        int idx = 0, ans = 1;
        while(candies > 0){
            if(ans <= candies)
            res[idx ++] += ans, candies -= ans, ans ++;
            else res[idx ++] += candies, candies = 0;
            if(idx == num_people) idx = 0;
        }
        return res;
    }
};

其實我們可以發現,每次應該分的的糖果數減一mod人數(假設人的編號從0開始),就是我們的人的編號,即陣列下標

程式碼如下

class Solution {
public:
    vector<int> distributeCandies(int candies, int num_people) {
        vector<int> res(num_people, 0);
        int ans = 0;
        while(candies > 0){
            res[ans % num_people] += min(ans + 1, candies);//要注意C++中先進行運算的是右邊
            candies -= ++ ans;
        }

        return res;
    }
};