



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第C++實現(xiàn)LeetCode(135.分糖果問題)[LeetCode]135.Candy分糖果問題
ThereareNchildrenstandinginaline.Eachchildisassignedaratingvalue.
Youaregivingcandiestothesechildrensubjectedtothefollowingrequirements:
Eachchildmusthaveatleastonecandy.
Childrenwithahigherratinggetmorecandiesthantheirneighbors.
Whatistheminimumcandiesyoumustgive
這道題看起來很難,其實解法并沒有那么復雜,當然我也是看了別人的解法才做出來的,先來看看兩遍遍歷的解法,首先初始化每個人一個糖果,然后這個算法需要遍歷兩遍,第一遍從左向右遍歷,如果右邊的小盆友的等級高,等加一個糖果,這樣保證了一個方向上高等級的糖果多。然后再從右向左遍歷一遍,如果相鄰兩個左邊的等級高,而左邊的糖果又少的話,則左邊糖果數(shù)為右邊糖果數(shù)加一。最后再把所有小盆友的糖果數(shù)都加起來返回即可。代碼如下:
解法一:
classSolution{
public:
intcandy(vectorintratings){
intres=0,n=ratings.size();
vectorintnums(n,1);
for(inti=0;in-1;++i){
if(ratings[i+1]ratings[i])nums[i+1]=nums[i]+1;
for(inti=n-1;i--i){
if(ratings[i-1]ratings[i])nums[i-1]=max(nums[i-1],nums[i]+1);
for(intnum:nums)res+=num;
returnres;
};
下面來看一次遍歷的方法,相比于遍歷兩次的思路簡單明了,這種只遍歷一次的解法就稍有些復雜了。首先我們給第一個同學一個糖果,那么對于接下來的一個同學就有三種情況:
1.接下來的同學的rating等于前一個同學,那么給接下來的同學一個糖果就行。
2.接下來的同學的rating大于前一個同學,那么給接下來的同學的糖果數(shù)要比前一個同學糖果數(shù)加1。
3.接下來的同學的rating小于前一個同學,那么我們此時不知道應(yīng)該給這個同學多少個糖果,需要看后面的情況。
對于第三種情況,我們不確定要給幾個,因為要是只給1個的話,那么有可能接下來還有rating更小的同學,總不能一個都不給吧。也不能直接給前一個同學的糖果數(shù)減1,有可能給多了,因為如果后面再沒人了的話,其實只要給一個就行了。還有就是,如果后面好幾個rating越來越小的同學,那么前一個同學的糖果數(shù)可能還得追加,以保證最后面的同學至少能有1個糖果。來一個例子吧,四個同學,他們的rating如下:
1321
先給第一個rating為1的同學一個糖果,然后從第二個同學開始遍歷,第二個同學rating為3,比1大,所以多給一個糖果,第二個同學得到兩個糖果。下面第三個同學,他的rating為2,比前一個同學的rating小,如果我們此時給1個糖果的話,那么rating更小的第四個同學就得不到糖果了,所以我們要給第四個同學1個糖果,而給第三個同學2個糖果,此時要給第二個同學追加1個糖果,使其能夠比第三個同學的糖果數(shù)多至少一個。那么我們就需要統(tǒng)計出多有個連著的同學的rating變小,用變量cnt來記錄,找出了最后一個減小的同學,那么就可以往前推,每往前一個加一個糖果,這就是個等差數(shù)列,我們可以直接利用求和公式算出這些rating減小的同學的糖果之和。然后我們還要看第一個開始減小的同學的前一個同學需不需要追加糖果,只要比較cnt和pre的大小,pre是之前同學得到的最大糖果數(shù),二者做差加1就是需要追加的糖果數(shù),加到結(jié)果res中即可,參見代碼如下:
解法二:
classSolution{
public:
intcandy(vectorintratings){
if(ratings.empty())return0;
intres=1,pre=1,cnt=0;
for(inti=1;iratings.size();++i){
if(ratings[i]=ratings[i-1]){
if(cnt0){
res+=cnt*(cnt+1)/2;
if(cnt=pre)res+=cnt-pre+1;
cnt=0;
pre=1;
pre=(ratings[i]==ratings[i-1])1:pre+1;
res+=pre;
}else{
++cnt;
if(cnt0){
res+=cnt*(cnt+1)/2;
if(cnt=pre)res+=cnt-pre+1;
returnres;
};
參考資料:
/topic/5243/a-simple-solution
/topic/8208/one-pass-constant-space-ja
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 武漢孚創(chuàng)java面試題及答案
- 觀點態(tài)度面試題及答案
- 公交問題面試題及答案
- 航空服務(wù)面試題及答案
- 大秦醫(yī)院面試題及答案
- 光譜檢測考試題及答案
- T/CAEPI 34-2021固定床蜂窩狀活性炭吸附濃縮裝置技術(shù)要求
- 建筑項目合伙經(jīng)營協(xié)議書
- 建筑機械訂購合同范本
- 體育行業(yè)用工合同范本
- (2023版)養(yǎng)老機構(gòu)院內(nèi)感染預防與控制規(guī)范解讀課件
- 傳統(tǒng)文化中國茶文化英語介紹
- 腦膠質(zhì)瘤課件
- 鋁合金鑄件冒口尺寸與補縮距離的影響因素
- 統(tǒng)計局考試試題及答案
- 工廠防暑降溫安全知識培訓內(nèi)容
- 統(tǒng)計與概率課標解讀與案例分析
- 《馬褲先生》閱讀答案
- 人教版九年級數(shù)學上冊《垂直于弦的直徑》評課稿
- 漸開線花鍵計算(最全的花鍵計算公式)
- 數(shù)學中考模擬試卷雙向細目表模板
評論
0/150
提交評論