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