135. 分發(fā)糖果(每日一題)

lzyprime 博客 (github)
創(chuàng)建時(shí)間:2020.12.24
qq及郵箱:2383518170

leetcode 筆記


題目描述

老師想給孩子們分發(fā)糖果起趾,有 N 個(gè)孩子站成了一條直線赤拒,老師會(huì)根據(jù)每個(gè)孩子的表現(xiàn)圆雁,預(yù)先給他們?cè)u(píng)分氯迂。

你需要按照以下要求捡遍,幫助老師給這些孩子分發(fā)糖果:

  • 每個(gè)孩子至少分配到 1 個(gè)糖果匿情。
  • 相鄰的孩子中击奶,評(píng)分高的孩子必須獲得更多的糖果匹耕。
  • 那么這樣下來渔呵,老師至少需要準(zhǔn)備多少顆糖果呢怒竿?
示例 1:

輸入: [1,0,2]
輸出: 5
解釋: 你可以分別給這三個(gè)孩子分發(fā) 2、1扩氢、2 顆糖果耕驰。
示例 2:

輸入: [1,2,2]
輸出: 4
解釋: 你可以分別給這三個(gè)孩子分發(fā) 1、2录豺、1 顆糖果朦肘。
     第三個(gè)孩子只得到 1 顆糖果,這已滿足上述兩個(gè)條件双饥。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/candy
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有媒抠。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處咏花。

code

開一個(gè)等長的數(shù)組 cnt趴生,記錄每人一顆糖后 i 位置額外要發(fā)幾顆糖。

從頭到尾掃一遍數(shù)組昏翰,如果 ratings[i] > ratings[i - 1] 說明比前一個(gè)人再多發(fā)一個(gè)糖苍匆,cnt[i] = cnt[i - 1] + 1; 否則不用多發(fā)任何糖棚菊, cnt[i] = 0

同理浸踩,從尾往頭掃,如果 ratings[i] > ratings[i + 1] 說明要比后一個(gè)人再多發(fā)一顆糖窍株,需要的糖果數(shù)與現(xiàn)有的cnt[i]比較民轴,留下最大的攻柠。

結(jié)果 人數(shù) + 額外需要糖果數(shù)

  • c++

class Solution
{
public:
    int candy(vector<int> &ratings)
    {
        if (ratings.empty())
            return 0;
        int size = ratings.size();

        vector<int> cnt(size, 0);
        for (int i = 1; i < size; i++)
            if (ratings[i] > ratings[i - 1])
                cnt[i] = cnt[i - 1] + 1;

        int ans = size + cnt[size - 1];
        for (int i = size - 2, pre = 0; i >= 0; i--)
            ans += max(pre = ratings[i] > ratings[i + 1] ? pre + 1 : 0, cnt[i]);

        return ans;
    }
};
  • kotlin

一刀流

fun candy(ratings: IntArray): Int = if (ratings.isEmpty()) 0 else ratings.foldIndexed(IntArray(ratings.size)) { i, arr, v -> arr.also { if (i > 0 && v > ratings[i - 1]) arr[i] = arr[i - 1] + 1 } }.let { cnt -> ratings.foldRightIndexed(ratings.size + cnt.last() to 0) { index, v, (ans, pre) -> if (index < ratings.size - 1 && v > ratings[index + 1]) ans + max(cnt[index], pre + 1) to pre + 1 else ans + cnt[index] to 0 } }.first
import kotlin.math.max

class Solution {
    fun candy(ratings: IntArray): Int = if (ratings.isEmpty()) 0 else
        ratings.foldIndexed(IntArray(ratings.size)) { i, arr, v ->
            arr.also { if (i > 0 && v > ratings[i - 1]) arr[i] = arr[i - 1] + 1 }
        }.let { cnt ->
            ratings.foldRightIndexed(ratings.size to 0) { index, v, (ans, pre) ->
                if (index < ratings.size - 1 && v > ratings[index + 1])
                    ans + max(cnt[index], pre + 1) to pre + 1
                else
                    ans + cnt[index] to 0
            }
        }.first
}
  • scala

一刀流

def candy(ratings: Array[Int]): Int = ratings.indices.foldLeft(Array.fill(ratings.length)(0)) { (arr, i) => if (i > 0 && ratings(i) > ratings(i - 1)) arr(i) = arr(i - 1) + 1; arr }.zipWithIndex.foldRight((ratings.length, 0)) { (i, acc) => if (i._2 < ratings.length - 1 && ratings(i._2) > ratings(i._2 + 1)) (acc._1 + math.max(i._1, acc._2 + 1), acc._2 + 1) else (acc._1 + i._1, 0) }._1
object Solution {
  def candy(ratings: Array[Int]): Int = ratings.indices.foldLeft(Array.fill(ratings.length)(0)) { (arr, i) =>
    if (i > 0 && ratings(i) > ratings(i - 1)) arr(i) = arr(i - 1) + 1; arr
  }.zipWithIndex.foldRight((ratings.length, 0)) { (i, acc) =>
    if (i._2 < ratings.length - 1 && ratings(i._2) > ratings(i._2 + 1))
      (acc._1 + math.max(i._1, acc._2 + 1), acc._2 + 1)
    else
      (acc._1 + i._1, 0)
  }._1
}
  • rust

一刀流

pub fn candy(ratings: Vec<i32>) -> i32 { (0..ratings.len()).fold(vec![0; ratings.len()], |mut arr, i| {if i > 0 && ratings[i] > ratings[i - 1] {arr[i] = arr[i - 1] + 1} arr}).iter().enumerate().rev().fold((ratings.len() as i32, 0), |(ans, pre), (i, &v)| {if i < ratings.len() - 1 && ratings[i] > ratings[i + 1] {(ans + max(v, pre + 1), pre + 1)} else {(ans + v, 0)}}).0}
use std::cmp::max;

impl Solution {
    pub fn candy(ratings: Vec<i32>) -> i32 {
        (0..ratings.len())
            .fold(vec![0; ratings.len()], |mut arr, i| {
                if i > 0 && ratings[i] > ratings[i - 1] {
                    arr[i] = arr[i - 1] + 1
                }
                arr
            })
            .iter()
            .enumerate()
            .rev()
            .fold((ratings.len() as i32, 0), |(ans, pre), (i, &v)| {
                if i < ratings.len() - 1 && ratings[i] > ratings[i + 1] {
                    (ans + max(v, pre + 1), pre + 1)
                } else {
                    (ans + v, 0)
                }
            })
            .0
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市后裸,隨后出現(xiàn)的幾起案子瑰钮,更是在濱河造成了極大的恐慌,老刑警劉巖微驶,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浪谴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡因苹,警方通過查閱死者的電腦和手機(jī)苟耻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扶檐,“玉大人凶杖,你說我怎么就攤上這事】钪” “怎么了智蝠?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奈梳。 經(jīng)常有香客問我杈湾,道長,這世上最難降的妖魔是什么攘须? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任漆撞,我火速辦了婚禮,結(jié)果婚禮上于宙,老公的妹妹穿的比我還像新娘浮驳。我一直安慰自己,他們只是感情好限煞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布抹恳。 她就那樣靜靜地躺著员凝,像睡著了一般署驻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上健霹,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天旺上,我揣著相機(jī)與錄音,去河邊找鬼糖埋。 笑死宣吱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瞳别。 我是一名探鬼主播征候,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼杭攻,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了疤坝?” 一聲冷哼從身側(cè)響起兆解,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跑揉,沒想到半個(gè)月后锅睛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡历谍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年现拒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片望侈。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡印蔬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脱衙,到底是詐尸還是另有隱情扛点,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布岂丘,位于F島的核電站陵究,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏奥帘。R本人自食惡果不足惜铜邮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寨蹋。 院中可真熱鬧松蒜,春花似錦、人聲如沸已旧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽运褪。三九已至惊楼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秸讹,已是汗流浹背檀咙。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留璃诀,地道東北人弧可。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像劣欢,于是被迫代替她去往敵國和親棕诵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子裁良,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 題目鏈接:https://leetcode-cn.com/problems/candy/ 思路:數(shù)組「rating...
    Jason_Shu閱讀 141評(píng)論 0 0
  • 標(biāo)題說明了一切,話不多說校套,開始正文吧趴久! 分發(fā)糖果 老師想給孩子們分發(fā)糖果,有 N 個(gè)孩子站成了一條直線搔确,老師會(huì)根據(jù)...
    思想永不平凡閱讀 537評(píng)論 0 4
  • 題目 (https://leetcode-cn.com/problems/candy/)老師想給孩子們分發(fā)糖果彼棍,有...
    Mastergad閱讀 287評(píng)論 0 0
  • 老師想給孩子們分發(fā)糖果,有 N 個(gè)孩子站成了一條直線膳算,老師會(huì)根據(jù)每個(gè)孩子的表現(xiàn)座硕,預(yù)先給他們?cè)u(píng)分。 你需要按照以下要...
    濱巖閱讀 304評(píng)論 0 0
  • 1涕蜂、題目 分發(fā)糖果 - 力扣(LeetCode) https://leetcode-cn.com/problems...
    風(fēng)卷晨沙閱讀 393評(píng)論 0 1