通俗易懂:贪心算法(三):习题练习 (力扣605种花问题、122买卖股票的最佳时机)
看完本文,可以順便解決leetcode以下兩個題目:
605.種花問題🌷(簡單)
122.買賣股票的最佳時機Ⅱ💳(簡單)
605.種花問題(簡單)
題目描述
假設有一個很長的花壇🌷,一部分地塊種植了花,另一部分卻沒有。可是,花不能種植在相鄰的地塊上,它們會爭奪水源,兩者都會死去。
給你一個整數數組 flowerbed 表示花壇,由若干 0 和 1 組成,其中 0 表示沒種植花,1 表示種植了花。另有一個數 n ,能否在不打破種植規則的情況下種入 n 朵花?🌹能則返回 true ,不能則返回 false。
輸入輸出樣例
輸入:flowerbed = [1,0,0,0,1], n = 1
輸出:true
題解
仔細觀察能夠發現,如果種了花,🌷花的兩邊都應該是空,即 組成 "010"的排布;
我們的貪心策略是,能種花的時候,就種下一顆花🌷;也就是說,遇到“000”在一起的時候,就代表能夠種花了。
那么再次觀察我們會發現,如果是“00”打開頭,或者“00”打結尾的情況呢?
這里就需要我們對于原數組進行一下處理了:在開頭和結尾都加上 0,這個 0 不會對原來的有什么影響,反而方便我們進行判斷操作;
class Solution { public://核心 就是010 三個是一起的 記住bool canPlaceFlowers(vector<int>& flowerbed, int n) {flowerbed.insert(flowerbed.begin(),0);//前后插入0 因為3個捆綁一起的 但是首,尾可以種花 所以改變一下flowerbed.push_back(0);int m=0;//放下的個數for(int i=0;i<flowerbed.size()-2;i++) //減去2 1.原來的倒數第一現在倒數第二 2. i從0開始的下標{if(flowerbed[i]==0&&flowerbed[i+1]==0&&flowerbed[i+2]==0){m++;i++;}}return m>=n; //因為返回是bool類型} };122.買賣股票的最佳時機Ⅱ💳
題目描述
給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。
設計一個算法來計算你所能獲取的最大利潤。你可以盡可能地完成更多的交易(多次買賣一支股票)。
注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。
輸入輸出樣例
輸入: [7,1,5,3,6,4]
輸出: 7
解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。
隨后,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6-3 = 3 。
題解
其實我們最基本的疑問,就是怎么去知道這個最大的值呢?💳
比如:[7,1,5,3,6,4];我在第二天價格是 1 的時候買了,后面的價格有 5 ,有6,我是不是應該留在價格是6的時候再賣出去呢?
不是這樣的!
我們的原則是 每天都買賣!💳
比如 [1,2,3,4,5]; 在 1 開始 買,5 開始賣; 怎么知道在 5 開始賣的?其實 我們這樣想, 每天都買賣,意思是 1 開始買 , 第二天 是 2 漲了,賣掉,但是 3 也漲了,而且 3 > 2 ;
我們應該在 3 開始賣,相當于,1 處買,2 處賣;看見3 又買了2 ,再賣3;(上帝視角,雖然過程不能這樣做);
總結就是,只要后面一天價格更高,我就賣;💳
不存在后面再跌 然后再等一個最大值的情況,這個情況還不如 先賣了,然后低點買 然后再賣;
每天都買賣 !!!💳
class Solution { public:int maxProfit(vector<int>& prices) {int total = 0;for(int i = 1; i < prices.size(); ++i) {if (prices[i] > prices[i-1]) {total += prices[i] - prices[i-1];}}return total;} };總結
以上是生活随笔為你收集整理的通俗易懂:贪心算法(三):习题练习 (力扣605种花问题、122买卖股票的最佳时机)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通俗易懂:贪心算法(二):区间问题 (力
- 下一篇: Python3 环境搭建、pycharm