国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

LeetCode刷題筆記【23】:貪心算法專題-1(分發(fā)餅干、擺動(dòng)序列、最大子序和)

這篇具有很好參考價(jià)值的文章主要介紹了LeetCode刷題筆記【23】:貪心算法專題-1(分發(fā)餅干、擺動(dòng)序列、最大子序和)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前置知識(shí)

貪心算法的本質(zhì)

貪心的本質(zhì)是選擇每一階段的局部最優(yōu),從而達(dá)到全局最優(yōu)。

例如,有一堆鈔票,你可以拿走十張,如果想達(dá)到最大的金額,你要怎么拿?
指定每次拿最大的,最終結(jié)果就是拿走最大數(shù)額的錢。
每次拿最大的就是局部最優(yōu),最后拿走最大數(shù)額的錢就是推出全局最優(yōu)。

什么時(shí)候用貪心算法?

  1. 感覺(jué)像是可以用貪心
  2. 用題中的案例試一下, 發(fā)現(xiàn)沒(méi)問(wèn)題
  3. 嘗試舉一下反例, 發(fā)現(xiàn)沒(méi)問(wèn)題
  4. 那就可以用了

所以貪心算法并沒(méi)有固定的規(guī)律和套路, 也不會(huì)要求你論證背后算法的合理性和有效性, 只要能解決問(wèn)題, 通過(guò)測(cè)試案例即可.

ps:個(gè)人認(rèn)為貪心非常虛無(wú)縹緲呀, 還是動(dòng)態(tài)規(guī)劃更加有跡可循;
并且在實(shí)踐過(guò)程中, 可以用貪心算法的, 基本都可以用動(dòng)態(tài)規(guī)劃.

什么時(shí)候不能用貪心?

當(dāng)局部最優(yōu), 不一定可以達(dá)到全局最優(yōu)的時(shí)候, 如:

有一堆盒子,你有一個(gè)背包體積為n,如何把背包盡可能裝;
如果還每次選最大的盒子,就不行了。
這時(shí)候就需要?jiǎng)討B(tài)規(guī)劃。

貪心算法的解題步驟

  1. 將問(wèn)題分解為若干個(gè)子問(wèn)題
  2. 找出適合的貪心策略
  3. 求解每一個(gè)子問(wèn)題的最優(yōu)解
  4. 將局部最優(yōu)解堆疊成全局最優(yōu)解

這樣的敘述非常抽象, 實(shí)踐過(guò)程中還是要把握思想: 選擇每一階段的局部最優(yōu),從而達(dá)到全局最優(yōu)

參考文章:關(guān)于貪心算法, 你該了解這些

455.分發(fā)餅干

題目描述

LeetCode刷題筆記【23】:貪心算法專題-1(分發(fā)餅干、擺動(dòng)序列、最大子序和),LeetCode刷題筆記,leetcode,筆記,貪心算法,算法,c++

LeetCode鏈接:https://leetcode.cn/problems/assign-cookies/description/

解題思路

思路: 先將兩個(gè)數(shù)組都srot
遍歷g數(shù)組, 優(yōu)先滿足胃口最小的孩子
遍歷g數(shù)組中的元素gg的時(shí)候, 依次遍歷s數(shù)組, 選擇能滿足gg的最小尺寸餅干

代碼

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        int ans=0;
        sort(g.begin(), g.end());
        sort(s.begin(), s.end());
        int ss=0;
        for(int gg : g){
            for(; ss<s.size(); ++ss){
                if(s[ss] >= gg){
                    s[ss] = 0;
                    ans++;
                    break;
                }
            }
        }
        return ans;
    }
};

376. 擺動(dòng)序列

題目描述

LeetCode刷題筆記【23】:貪心算法專題-1(分發(fā)餅干、擺動(dòng)序列、最大子序和),LeetCode刷題筆記,leetcode,筆記,貪心算法,算法,c++

LeetCode鏈接:https://leetcode.cn/problems/wiggle-subsequence/description/

解題思路

<代>: 其實(shí)過(guò)程中不需要對(duì)數(shù)組進(jìn)行操作, 只需要看有多少個(gè)點(diǎn)是符合要求的即可;
具體過(guò)程比較復(fù)雜, 建議參考其原文.

代碼

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        int n=nums.size();
        if(n==0 || n==1 || (n==2 && nums[0]!=nums[1]))
            return n;
        int curDiff = 0;
        int preDiff = 0;
        int ans=1;
        for(int i=0; i<n-1; ++i){
            curDiff = nums[i+1] - nums[i];
            if((preDiff<=0 && curDiff>0) || (preDiff>=0 && curDiff<0)){
                ans++;
                preDiff = curDiff;
            }
        }
        return ans;
    }
};

53. 最大子序和

題目描述

LeetCode刷題筆記【23】:貪心算法專題-1(分發(fā)餅干、擺動(dòng)序列、最大子序和),LeetCode刷題筆記,leetcode,筆記,貪心算法,算法,c++

LeetCode鏈接:https://leetcode.cn/problems/maximum-subarray/description/

暴力解法

思路: 暴力解法
對(duì)數(shù)組中每個(gè)數(shù), 都依次向后遍歷所有子數(shù)組, 求和, 和ansmax

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int ans=INT_MIN;
        for(int i=0; i<nums.size(); ++i){
            int sum=0;
            for(int j=i; j<nums.size(); ++j){
                sum += nums[j];
                ans = max(ans, sum);
            }
        }
        return ans;
    }
};

動(dòng)態(tài)規(guī)劃

不出所料的, 超出時(shí)間限制;
用動(dòng)態(tài)規(guī)劃, 創(chuàng)建數(shù)組maxSum
nums[0]maxSum[0]就是自己本身
之后的nums[i]maxSum[i]=max(nums[i], maxSum[i-1]+nums[i])

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if(nums.size()==1)
            return nums[0];
        vector<int> maxSum(nums.size());
        maxSum[0] = nums[0];
        int ans=nums[0];
        for(int i=1; i<nums.size(); ++i){
            maxSum[i] = max(nums[i], maxSum[i-1]+nums[i]);
            ans = max(ans, maxSum[i]);
        }
        return ans;
    }
};

優(yōu)化: 不用數(shù)組用pre

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int ans = nums[0];
        int pre = nums[0];
        for(int i=1; i<nums.size(); ++i){
            pre = max(pre+nums[i], nums[i]);
            ans = max(ans, pre);
        }
        return ans;
    }
};

貪心算法

LeetCode刷題筆記【23】:貪心算法專題-1(分發(fā)餅干、擺動(dòng)序列、最大子序和),LeetCode刷題筆記,leetcode,筆記,貪心算法,算法,c++
選取一個(gè)個(gè)"區(qū)間", 過(guò)程中用count記錄區(qū)間內(nèi)的和;
當(dāng)count<0時(shí), 將其清空(=0)

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int ans = INT_MIN;
        int count=0;
        for(int i=0; i<nums.size(); ++i){
            count += nums[i];
            ans = max(ans, count);
            if(count<0)
                count = 0;
        }
        return ans;
    }
};

總結(jié)

相比于動(dòng)態(tài)規(guī)劃, 貪心算法的思路難把握的多, 也很難以揣摩;
所以過(guò)程中如果想不出來(lái), 第一反應(yīng)應(yīng)該是嘗試動(dòng)態(tài)規(guī)劃, 或者直接看題解;

一方面不要在做題過(guò)程中硬磕貪心算法;
另一方面在學(xué)習(xí)的時(shí)候, 不要過(guò)于較真, 對(duì)于貪心這一部分的內(nèi)容, 可以適當(dāng)抱著"了解"和:"探索學(xué)習(xí)"的心態(tài).
把精力多花在可以比較快比較好地掌握和把握的部分和方法上.

本文參考:
分發(fā)餅干
擺動(dòng)序列
最大子序和文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-700735.html

到了這里,關(guān)于LeetCode刷題筆記【23】:貪心算法專題-1(分發(fā)餅干、擺動(dòng)序列、最大子序和)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 算法訓(xùn)練day31貪心算法理論基礎(chǔ)Leetcode455分發(fā)餅干376擺動(dòng)序列53最大子序和

    文章鏈接 代碼隨想錄 (programmercarl.com) 說(shuō)實(shí)話貪心算法并沒(méi)有固定的套路 。 最好用的策略就是舉反例,如果想不到反例,那么就試一試貪心吧 。 面試中基本不會(huì)讓面試者現(xiàn)場(chǎng)證明貪心的合理性,代碼寫出來(lái)跑過(guò)測(cè)試用例即可,或者自己能自圓其說(shuō)理由就行了 。 刷題或者面

    2024年02月20日
    瀏覽(20)
  • 分發(fā)餅干【貪心算法】

    分發(fā)餅干【貪心算法】

    分發(fā)餅干 假設(shè)你是一位很棒的家長(zhǎng),想要給你的孩子們一些小餅干。但是,每個(gè)孩子最多只能給一塊餅干。 對(duì)每個(gè)孩子 i,都有一個(gè)胃口值 g[i],這是能讓孩子們滿足胃口的餅干的最小尺寸;并且每塊餅干 j,都有一個(gè)尺寸 s[j] 。如果 s[j] = g[i],我們可以將這個(gè)餅干 j 分配給

    2024年02月11日
    瀏覽(21)
  • LeetCode刷題筆記【26】:貪心算法專題-4(檸檬水找零、根據(jù)身高重建隊(duì)列、用最少數(shù)量的箭引爆氣球)

    LeetCode刷題筆記【26】:貪心算法專題-4(檸檬水找零、根據(jù)身高重建隊(duì)列、用最少數(shù)量的箭引爆氣球)

    參考前文 參考文章: LeetCode刷題筆記【23】:貪心算法專題-1(分發(fā)餅干、擺動(dòng)序列、最大子序和) LeetCode刷題筆記【24】:貪心算法專題-2(買賣股票的最佳時(shí)機(jī)II、跳躍游戲、跳躍游戲II) LeetCode刷題筆記【25】:貪心算法專題-3(K次取反后最大化的數(shù)組和、加油站、分發(fā)糖

    2024年02月09日
    瀏覽(25)
  • 算法 貪心1 || 455.分發(fā)餅干 376. 擺動(dòng)序列 53. 最大子數(shù)組和

    算法 貪心1 || 455.分發(fā)餅干 376. 擺動(dòng)序列 53. 最大子數(shù)組和

    什么是貪心:貪心的本質(zhì)是選擇每一階段的局部最優(yōu),從而達(dá)到全局最優(yōu)。 但是貪心沒(méi)有套路,做題的時(shí)候,只要想清楚 局部最優(yōu) 是什么,如果推導(dǎo)出全局最優(yōu),其實(shí)就夠了。 很容易想到,把孩子的胃口和餅干大小都排序,都從最小值開始遍歷。如果最小的餅干無(wú)法滿足最

    2023年04月16日
    瀏覽(27)
  • 算法刷題Day 31 分發(fā)餅干+擺動(dòng)序列+最大子序列和

    分發(fā)餅干其實(shí)有很多種寫法,但是下面這種貪心的解法是最好理解,也最好解釋的 我的其他解法 貪心算法 這道題用貪心算法要考慮的細(xì)節(jié)有很多。 動(dòng)態(tài)規(guī)劃 有點(diǎn)難(甚至涉及到了線段樹),等后面二刷的時(shí)候再來(lái)學(xué)好了 暴力解法 超時(shí)了 貪心算法 貪心算法的代碼寫起來(lái)簡(jiǎn)

    2024年02月15日
    瀏覽(21)
  • Day31 貪心算法 part01 理論基礎(chǔ) 455.分發(fā)餅干 376.擺動(dòng)序列 53.最大子序和

    Day31 貪心算法 part01 理論基礎(chǔ) 455.分發(fā)餅干 376.擺動(dòng)序列 53.最大子序和

    什么是貪心 貪心的本質(zhì)是選擇每一階段的局部最優(yōu),從而達(dá)到全局最優(yōu) 。 這么說(shuō)有點(diǎn)抽象,來(lái)舉一個(gè)例子: 例如,有一堆鈔票,你可以拿走十張,如果想達(dá)到最大的金額,你要怎么拿? 指定每次拿最大的,最終結(jié)果就是拿走最大數(shù)額的錢。 每次拿最大的就是局部最優(yōu),最

    2024年01月19日
    瀏覽(31)
  • 455. 分發(fā)餅干 - 力扣(LeetCode)

    455. 分發(fā)餅干 - 力扣(LeetCode)

    假設(shè)你是一位很棒的家長(zhǎng),想要給你的孩子們一些小餅干。但是,每個(gè)孩子最多只能給一塊餅干。 對(duì)每個(gè)孩子 i,都有一個(gè)胃口值 g[i],這是能讓孩子們滿足胃口的餅干的最小尺寸;并且每塊餅干 j,都有一個(gè)尺寸 s[j] 。如果 s[j] = g[i],我們可以將這個(gè)餅干 j 分配給孩子 i ,這

    2024年01月25日
    瀏覽(15)
  • LeetCode(力扣)455. 分發(fā)餅干Python

    LeetCode(力扣)455. 分發(fā)餅干Python

    https://leetcode.cn/problems/assign-cookies/ 從大遍歷 從小遍歷

    2024年02月09日
    瀏覽(20)
  • 力扣算法刷題Day34|貪心:K次取反后最大化的數(shù)組和 加油站 分發(fā)糖果

    力扣題目:# 1005.K次取反后最大化的數(shù)組和? 刷題時(shí)長(zhǎng):10min 解題方法:貪心 復(fù)雜度分析 時(shí)間O(n) 空間O(1) 問(wèn)題總結(jié) 無(wú) 本題收獲 貪心思路:兩次貪心 在包含正負(fù)無(wú)序的整數(shù)數(shù)組中,如何轉(zhuǎn)變K次正負(fù),讓數(shù)組和達(dá)到最大 局部最優(yōu):讓絕對(duì)值大的負(fù)數(shù)變?yōu)檎龜?shù),當(dāng)前數(shù)值達(dá)到

    2024年02月09日
    瀏覽(39)
  • 【貪心算法】leetcode刷題

    【貪心算法】leetcode刷題

    貪心算法無(wú)固定套路。 核心思想:先找局部最優(yōu),再擴(kuò)展到全局最優(yōu)。 兩種思路: 1、從大到小。局部最優(yōu)就是大餅干喂給胃口大的,充分利用餅干尺寸喂飽一個(gè),全局最優(yōu)就是喂飽盡可能多的小孩。 先遍歷的胃口,在遍歷的餅干 2、從小到大。 小餅干先喂飽小胃口 。兩個(gè)

    2024年02月14日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包