0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:代碼隨想錄 ? 作者:代碼隨想錄 ? 2022-06-06 09:25 ? 次閱讀

貪心的第一道題目,快看看你夠不夠貪心

455.分發(fā)餅干

力扣題目鏈接:https://leetcode-cn.com/problems/assign-cookies

假設(shè)你是一位很棒的家長,想要給你的孩子們一些小餅干。但是,每個(gè)孩子最多只能給一塊餅干。

對每個(gè)孩子 i,都有一個(gè)胃口值 g[i],這是能讓孩子們滿足胃口的餅干的最小尺寸;并且每塊餅干 j,都有一個(gè)尺寸 s[j]。如果 s[j]>= g[i],我們可以將這個(gè)餅干 j 分配給孩子 i ,這個(gè)孩子會得到滿足。你的目標(biāo)是盡可能滿足越多數(shù)量的孩子,并輸出這個(gè)最大數(shù)值。

示例1:

  • 輸入: g = [1,2,3], s = [1,1]
  • 輸出: 1 解釋:你有三個(gè)孩子和兩塊小餅干,3個(gè)孩子的胃口值分別是:1,2,3。雖然你有兩塊小餅干,由于他們的尺寸都是1,你只能讓胃口值是1的孩子滿足。所以你應(yīng)該輸出1。

示例2:

  • 輸入: g = [1,2], s = [1,2,3]
  • 輸出: 2
  • 解釋:你有兩個(gè)孩子和三塊小餅干,2個(gè)孩子的胃口值分別是1,2。你擁有的餅干數(shù)量和尺寸都足以讓所有孩子滿足。所以你應(yīng)該輸出2.

提示:

  • 1 <= g.length <= 3 * 10^4
  • 0 <= s.length <= 3 * 10^4
  • 1 <= g[i], s[j] <=?2^31 - 1

思路

為了了滿足更多的小孩,就不要造成餅干尺寸的浪費(fèi)。

大尺寸的餅干既可以滿足胃口大的孩子也可以滿足胃口小的孩子,那么就應(yīng)該優(yōu)先滿足胃口大的。

這里的局部最優(yōu)就是大餅干喂給胃口大的,充分利用餅干尺寸喂飽一個(gè),全局最優(yōu)就是喂飽盡可能多的小孩。

可以嘗試使用貪心策略,先將餅干數(shù)組和小孩數(shù)組排序。

然后從后向前遍歷小孩數(shù)組,用大餅干優(yōu)先滿足胃口大的,并統(tǒng)計(jì)滿足小孩數(shù)量。

如圖:

3d55a436-e537-11ec-ba43-dac502259ad0.png455.分發(fā)餅干

這個(gè)例子可以看出餅干9只有喂給胃口為7的小孩,這樣才是整體最優(yōu)解,并想不出反例,那么就可以擼代碼了。

C++代碼整體如下:

//時(shí)間復(fù)雜度:O(nlogn)
//空間復(fù)雜度:O(1)
classSolution{
public:
intfindContentChildren(vector<int>&g,vector<int>&s){
sort(g.begin(),g.end());
sort(s.begin(),s.end());
intindex=s.size()-1;//餅干數(shù)組的下表
intresult=0;
for(inti=g.size()-1;i>=0;i--){
if(index>=0&&s[index]>=g[i]){
result++;
index--;
}
}
returnresult;
}
};

從代碼中可以看出我用了一個(gè)index來控制餅干數(shù)組的遍歷,遍歷餅干并沒有再起一個(gè)for循環(huán),而是采用自減的方式,這也是常用的技巧。

有的同學(xué)看到要遍歷兩個(gè)數(shù)組,就想到用兩個(gè)for循環(huán),那樣邏輯其實(shí)就復(fù)雜了。

也可以換一個(gè)思路,小餅干先喂飽小胃口

代碼如下:

classSolution{
public:
intfindContentChildren(vector<int>&g,vector<int>&s){
sort(g.begin(),g.end());
sort(s.begin(),s.end());
intindex=0;
for(inti=0;iif(indexreturnindex;
}
};

總結(jié)

這道題是貪心很好的一道入門題目,思路還是比較容易想到的。

文中詳細(xì)介紹了思考的過程,想清楚局部最優(yōu),想清楚全局最優(yōu),感覺局部最優(yōu)是可以推出全局最優(yōu),并想不出反例,那么就試一試貪心。

其他語言版本

Java

classSolution{
//思路1:優(yōu)先考慮餅干,小餅干先喂飽小胃口
publicintfindContentChildren(int[]g,int[]s){
Arrays.sort(g);
Arrays.sort(s);
intstart=0;
intcount=0;
for(inti=0;iif(s[i]>=g[start]){
start++;
count++;
}
}
returncount;
}
}
classSolution{
//思路2:優(yōu)先考慮胃口,先喂飽大胃口
publicintfindContentChildren(int[]g,int[]s){
Arrays.sort(g);
Arrays.sort(s);
intcount=0;
intstart=s.length-1;
//遍歷胃口
for(intindex=g.length-1;index>=0;index--){
if(start>=0&&g[index]<=?s[start])?{
????????????????start--;
????????????????count++;
????????????}
????????}
????????returncount;
}
}

Python

class Solution:
    # 思路1:優(yōu)先考慮胃餅干
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g.sort()
        s.sort()
        res = 0
        for i in range(len(s)):
            if res = g[res]:  #小餅干先喂飽小胃口
                res += 1
        return res
classSolution:
#思路2:優(yōu)先考慮胃口
deffindContentChildren(self,g:List[int],s:List[int])->int:
g.sort()
s.sort()
start,count=len(s)-1,0
forindexinrange(len(g)-1,-1,-1):#先喂飽大胃口
ifstart>=0andg[index]<=?s[start]:
????????????????start?-=?1
count+=1
returncount

Go

//排序后,局部最優(yōu)
funcfindContentChildren(g[]int,s[]int)int{
sort.Ints(g)
sort.Ints(s)

//從小到大
child:=0
forsIdx:=0;childlen(g)&&sIdxlen(s);sIdx++{
ifs[sIdx]>=g[child]{//如果餅干的大小大于或等于孩子的為空則給與,否則不給予,繼續(xù)尋找選一個(gè)餅干是否符合
child++
}
}

returnchild
}

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4552

    瀏覽量

    92019
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    411

    瀏覽量

    25821

原文標(biāo)題:分發(fā)餅干,也要貪心

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    RobustRIO-E模塊 時(shí)鐘同步&分發(fā),實(shí)現(xiàn)聲音與振動板卡間及跨機(jī)箱時(shí)鐘同步

    同步時(shí)鐘發(fā)生器 + 同步時(shí)鐘分發(fā)
    的頭像 發(fā)表于 09-14 15:00 ?145次閱讀
    RobustRIO-E模塊 時(shí)鐘同步&<b class='flag-5'>分發(fā)</b>,實(shí)現(xiàn)聲音與振動板卡間及跨機(jī)箱時(shí)鐘同步

    使用 BQ25180 線性充電器充分發(fā)揮NTC的全部潛力

    電子發(fā)燒友網(wǎng)站提供《使用 BQ25180 線性充電器充分發(fā)揮NTC的全部潛力.pdf》資料免費(fèi)下載
    發(fā)表于 09-09 09:32 ?0次下載
    使用 BQ25180 線性充電器充<b class='flag-5'>分發(fā)</b>揮NTC的全部潛力

    深度學(xué)習(xí)的基本原理與核心算法

    處理、語音識別等領(lǐng)域取得了革命性的突破。本文將詳細(xì)闡述深度學(xué)習(xí)的原理、核心算法以及實(shí)現(xiàn)方式,并通過一個(gè)具體的代碼實(shí)例進(jìn)行說明。
    的頭像 發(fā)表于 07-04 11:44 ?1075次閱讀

    神經(jīng)網(wǎng)絡(luò)反向傳播算法的優(yōu)缺點(diǎn)有哪些

    是一種模擬人腦神經(jīng)元網(wǎng)絡(luò)的計(jì)算模型,具有強(qiáng)大的非線性映射能力和泛化能力。反向傳播算法是訓(xùn)練神經(jīng)網(wǎng)絡(luò)的核心算法,通過梯度下降法優(yōu)化網(wǎng)絡(luò)權(quán)重,使網(wǎng)絡(luò)輸出盡可能接近目標(biāo)值。然而,反向傳播算法也存在一些局限性和問題,需要在實(shí)際應(yīng)用中加以
    的頭像 發(fā)表于 07-03 11:24 ?324次閱讀

    AI智算中心算力服務(wù)商探索智造完成A輪融資

    近日,領(lǐng)先的AI智算中心算力服務(wù)商探索智造宣布成功完成A輪融資。本輪融資由無錫云林產(chǎn)業(yè)發(fā)展投資基金領(lǐng)投,旨在為公司提供強(qiáng)大的資金支持,助力其業(yè)務(wù)的進(jìn)一步拓展和升級。
    的頭像 發(fā)表于 05-30 09:33 ?376次閱讀

    機(jī)器學(xué)習(xí)六大核心算法深度解析

    算法歷程:線性回歸是一種古老的統(tǒng)計(jì)方法,它試圖找到最佳擬合數(shù)據(jù)的直線或超平面,最早可以追溯到19世紀(jì)初的高斯最小二乘法理論。
    發(fā)表于 04-23 16:25 ?1028次閱讀
    機(jī)器學(xué)習(xí)六大核<b class='flag-5'>心算法</b>深度解析

    基于門控線性網(wǎng)絡(luò)(GLN)的高壓縮比無損醫(yī)學(xué)圖像壓縮算法

    實(shí)現(xiàn)基于門控線性網(wǎng)絡(luò)(GLN)的高壓縮比無損醫(yī)學(xué)圖像壓縮算法,以提高醫(yī)學(xué)圖像存儲和分發(fā)系統(tǒng)的效率。與“傳統(tǒng)”的基于上下文的數(shù)據(jù)壓縮算法相比,基于GLN的系統(tǒng)使用一組不同的上下文模型。
    的頭像 發(fā)表于 04-08 10:29 ?482次閱讀
    基于門控線性網(wǎng)絡(luò)(GLN)的高壓縮比無損醫(yī)學(xué)圖像壓縮<b class='flag-5'>算法</b>

    陀螺儀芯片+傳感器定制

    本人想開發(fā)一套摔倒瞬間的觸發(fā)系統(tǒng),目前缺主程序核心算法。有懂的大神求指教
    發(fā)表于 03-21 10:36

    鴻蒙原生應(yīng)用/元服務(wù)開發(fā)-AGC分發(fā)如何上架HarmonyOS應(yīng)用

    ”下拉框僅篩選出HarmonyOS應(yīng)用,或點(diǎn)擊“支持設(shè)備”按設(shè)備類型篩選查找。 3.點(diǎn)擊待發(fā)布的HarmonyOS應(yīng)用名稱,在左側(cè)導(dǎo)航欄選擇“應(yīng)用信息”菜單。 4.如果開發(fā)者尚未簽署華為智慧分發(fā)平臺
    發(fā)表于 11-24 14:44

    Andriod中VSync的分發(fā)

    App與SurfaceFlinger是不同的進(jìn)程,它們之間傳遞VSync的話涉及到進(jìn)程間通信,而且VSync頻率很高,App很多,所以VSync的分發(fā)效率要很高才行。Linux進(jìn)程間通信方式總共
    的頭像 發(fā)表于 11-21 16:32 ?628次閱讀
    Andriod中VSync的<b class='flag-5'>分發(fā)</b>

    完美時(shí)序-時(shí)鐘產(chǎn)生和分發(fā)設(shè)計(jì)指南

    電子發(fā)燒友網(wǎng)站提供《完美時(shí)序-時(shí)鐘產(chǎn)生和分發(fā)設(shè)計(jì)指南.pdf》資料免費(fèi)下載
    發(fā)表于 11-18 10:27 ?0次下載
    完美時(shí)序-時(shí)鐘產(chǎn)生和<b class='flag-5'>分發(fā)</b>設(shè)計(jì)指南

    鴻蒙原生應(yīng)用開發(fā)-元服務(wù)分發(fā)方式的調(diào)整及趨勢

    元服務(wù)上架審核通過后,會收到郵件通知,但此時(shí)還無法搜索到上架的元服務(wù),需要華為進(jìn)行配置后,才能讓元服務(wù)露出。當(dāng)前,元服務(wù)分發(fā)的主要渠道有: 1.應(yīng)用市場:具備搜索能力,在搜索結(jié)果的“服務(wù)”頁簽露出
    發(fā)表于 11-14 16:02

    華測導(dǎo)航:不斷優(yōu)化核心算法,同時(shí)布局車規(guī)級芯片

    華測導(dǎo)航推出的新一代cgi-430高精密慣性導(dǎo)航系統(tǒng)以系統(tǒng)全體頻率的gnss基礎(chǔ)卡和6軸戰(zhàn)術(shù)級imu為基礎(chǔ),使用中國領(lǐng)航員的新一代貼合算法引擎,結(jié)合gnss、ins、dr信息進(jìn)行計(jì)算。
    的頭像 發(fā)表于 11-14 14:34 ?1062次閱讀

    如何充分發(fā)揮SQL能力?

    如何充分發(fā)揮 SQL 能力,是本篇文章的主題。本文嘗試獨(dú)辟蹊徑,強(qiáng)調(diào)通過靈活的、發(fā)散性的數(shù)據(jù)處理思維,就可以用最基礎(chǔ)的語法,解決復(fù)雜的數(shù)據(jù)場景。
    的頭像 發(fā)表于 11-05 11:23 ?755次閱讀
    如何充<b class='flag-5'>分發(fā)</b>揮SQL能力?

    機(jī)器視覺檢測解決方案:餅干尺寸檢測

    對于現(xiàn)有餅干生產(chǎn)商來說,制作餅干的相關(guān)尺寸和管理過程仍存在著低效、高成本、難監(jiān)管等問題,數(shù)字化的匱乏嚴(yán)重阻礙了關(guān)鍵數(shù)據(jù)的采集與分析,無法及時(shí)有效進(jìn)行優(yōu)化管理與決策,餅干制造廠的數(shù)智轉(zhuǎn)型是解決這些
    的頭像 發(fā)表于 10-11 09:55 ?293次閱讀
    機(jī)器視覺檢測解決方案:<b class='flag-5'>餅干</b>尺寸檢測