天天看點

leetcode-16-greedyAlgorithm

455. Assign Cookies

解題思路:

先将兩個數組按升序排序,然後從後往前周遊,當s[j] >= g[i]的時候,就把s[j]分給g[i],i,j都向前移動,count+1;否則向前移動i,直到可以找到這樣的i。

還是很典型的貪心算法啊。

int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(), g.end());
        sort(s.begin(), s.end());
        int i = g.size() - 1;
        int j = s.size() - 1;
        int count = 0;
        while (i >= 0 && j >= 0) {
            if (g[i] > s[j])
                i --;
            else {
                i --;
                j --;
                count ++;
            }
        }
        return count;
    }
      

122. Best Time to Buy and Sell Stock II

解題思路:

這道題的話,隻要考慮臨近兩天的情況就好了。如果第二天賣的價格高于第一天買入的價格,收益為正,就可以進行。另外,當prices為空或者隻有一個

元素時,顯然不能買入,收益應該保持0。

int maxProfit(vector<int>& prices) {
        if (prices.size() <= 1)
            return 0;
        int i;
        int sum = 0;
        for (i = 0; i < prices.size() - 1; i++ ) {
            sum += max((prices[i+1] - prices[i]), 0);
        }
        return sum;
    }      

與上面相關的是這道題:

121. Best Time to Buy and Sell Stock

解題思路:

周遊一遍prices,用Min表示目前找到的最小值,用Max記錄最大收益。找Max時,如果目前prices[i]-Min < Max,那麼Max就不變。

int maxProfit(vector<int>& prices) {
        if (prices.size() <= 1)
            return 0;
        int Min = prices[0];
        int Max = 0;
        for (int i = 0; i < prices.size(); i++) {
            Min = min(Min, prices[i]);
            Max = max(Max, prices[i] - Min);
        }
        return Max;
    }