21-發糖果

?n 個孩子站成一排。給你一個整數數組 ratings 表示每個孩子的評分。 你需要按照以下要求,給這些孩子分發糖果: 每個孩子至少分配到 1 個糖果。 相鄰兩個孩子評分更高的孩子會獲得更多的糖果。 請你給每個孩子分發糖果,計算并返回需要準備的 最少糖果數目 。

方法一:貪心算法

function candy(ratings: number[]): number {const n = ratings.length;const candies = new Array(n).fill(1);// 從左到右遍歷,保證右邊評分高的孩子糖果多for (let i = 1; i < n; i++) {if (ratings[i] > ratings[i - 1]) {candies[i] = candies[i - 1] + 1;}}// 從右到左遍歷,保證左邊評分高的孩子糖果多for (let i = n - 2; i >= 0; i--) {if (ratings[i] > ratings[i + 1] && candies[i] <= candies[i + 1]) {candies[i] = candies[i + 1] + 1;}}// 計算糖果總數let total = 0;for (const candy of candies) {total += candy;}return total;
}// 示例調用
const ratings = [1, 0, 2];
const result = candy(ratings);
console.log("需要準備的最少糖果數目:", result);

代碼解釋

  1. 初始化糖果數組:創建一個長度為?n?的數組?candies,并將每個元素初始化為?1,表示每個孩子至少分配到?1?個糖果。
  2. 從左到右遍歷:通過?for?循環從索引?1?到?n - 1?遍歷數組。如果當前孩子的評分?ratings[i]?大于左邊孩子的評分?ratings[i - 1],則將當前孩子的糖果數?candies[i]?設置為左邊孩子糖果數?candies[i - 1]?加?1,以滿足相鄰孩子評分更高的孩子獲得更多糖果的條件。
  3. 從右到左遍歷:再通過?for?循環從索引?n - 2?到?0?反向遍歷數組。如果當前孩子的評分?ratings[i]?大于右邊孩子的評分?ratings[i + 1],并且當前孩子的糖果數?candies[i]?小于等于右邊孩子的糖果數?candies[i + 1],則將當前孩子的糖果數?candies[i]?設置為右邊孩子糖果數?candies[i + 1]?加?1,進一步保證滿足條件。
  4. 計算糖果總數:遍歷?candies?數組,將每個孩子的糖果數累加到變量?total?中,最后返回?total,即需要準備的最少糖果數目。

復雜度分析

  • 時間復雜度:(O(n)),其中?n?是孩子的數量。代碼中進行了兩次遍歷數組的操作,每次遍歷的時間復雜度都是?(O(n)),最后計算糖果總數的遍歷時間復雜度也為?(O(n)),所以總的時間復雜度為?(O(n))。
  • 空間復雜度:(O(n)),用于存儲每個孩子分配的糖果數的數組?candies?的長度為?n,因此空間復雜度為?(O(n))。

這種貪心算法的思路通過兩次遍歷,分別從不同方向保證了糖果分配滿足條件,從而高效地計算出了最少糖果數目。

方法二:山峰山谷想象法

思路分析

可以將孩子的評分序列看作是一系列的山峰和山谷。對于上升序列(評分遞增),糖果數依次遞增;對于下降序列(評分遞減),糖果數也依次遞減;而在山谷處(評分局部最小),糖果數為 1。我們可以通過一次遍歷找出所有的上升和下降序列,然后計算每個序列所需的糖果數。

代碼實現

function candy(ratings: number[]): number {const n = ratings.length;if (n <= 1) {return n;}let totalCandies = 0;let up = 0; // 上升序列的長度let down = 0; // 下降序列的長度let oldSlope = 0;for (let i = 1; i < n; i++) {// 當前的斜率,1 表示上升, -1 表示下降, 0 表示相等let newSlope = ratings[i] > ratings[i - 1]? 1 : (ratings[i] < ratings[i - 1]? -1 : 0);if ((oldSlope > 0 && newSlope === 0) || (oldSlope < 0 && newSlope >= 0)) {// 當上升序列結束或者下降序列結束時totalCandies += count(up) + count(down) + Math.max(up, down);up = 0;down = 0;}if (newSlope > 0) {up++;} else if (newSlope < 0) {down++;} else {totalCandies++;}oldSlope = newSlope;}// 處理最后一個上升或下降序列totalCandies += count(up) + count(down) + Math.max(up, down) + 1;return totalCandies;
}// 計算長度為 length 的序列所需的糖果數
function count(length: number): number {return (length * (length + 1)) / 2;
}

代碼解釋

  1. 初始化變量

    • n?為孩子的數量。
    • totalCandies?用于記錄總共需要的糖果數,初始化為 0。
    • up?記錄當前上升序列的長度,down?記錄當前下降序列的長度,初始都為 0。
    • oldSlope?記錄上一個位置的斜率,初始為 0。
  2. 遍歷評分序列

    • 計算當前位置的斜率?newSlope,如果當前評分大于前一個評分,newSlope?為 1;如果小于,為 -1;如果相等,為 0。
    • 當上升序列結束(oldSlope > 0 && newSlope === 0)或者下降序列結束(oldSlope < 0 && newSlope >= 0)時,計算該上升和下降序列所需的糖果數,并累加到?totalCandies?中,同時重置?up?和?down?為 0。
    • 根據?newSlope?的值更新?updown?或?totalCandies。如果?newSlope?為 1,up?加 1;如果為 -1,down?加 1;如果為 0,totalCandies?加 1。
    • 更新?oldSlope?為?newSlope
  3. 處理最后一個序列

    • 遍歷結束后,處理最后一個上升或下降序列,將其所需的糖果數累加到?totalCandies?中。
  4. 計算序列所需糖果數

    • count?函數用于計算長度為?length?的序列所需的糖果數,根據等差數列求和公式?(length * (length + 1)) / 2?計算。

復雜度分析

  • 時間復雜度:(O(n)),其中?n?是孩子的數量。只需要對評分序列進行一次遍歷。
  • 空間復雜度:(O(1)),只使用了常數級的額外變量。

這種方法通過直接分析評分序列的上升和下降趨勢,避免了兩次遍歷,在邏輯上更加直觀,同時保持了線性的時間復雜度。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72044.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72044.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72044.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

sql深入學習

文章目錄 前言知識學習注釋的兩種形式字符型注入萬能密碼 布爾盲注報錯注入堆疊注入時間盲注二次注入 小技巧 前言 這次學習建立在對數據庫有基本的認識&#xff0c;了解基礎的增刪改查語句&#xff0c;數字型注入和字符型注入的基礎上&#xff0c;進一步深入學習知識&#xf…

利用three.js在Vue項目中展示重構的stl模型文件

一、目的 為了在前端頁面展示3d打印機打印過程 二、前期準備 完整模型的stl文件和模型切割成的n個stl文件 models文件夾下的文件就是切割后的stl文件 三、代碼 <template><div ref"threeContainer" class"three-container"></div><…

【Eureka 緩存機制】

今天簡單介紹一下Eureka server 的緩存機制吧?????? 一、先來個小劇場&#xff1a;服務發現的"拖延癥" 想象你是個外賣小哥&#xff08;客戶端&#xff09;&#xff0c;每次接單都要打電話問調度中心&#xff08;Eureka Server&#xff09;&#xff1a;“現在…

Python--內置模塊和開發規范(下)

2. 開發規范 2.1 單文件應用 文件結構示例 # 文件注釋 import os import jsonDB_PATH "data.json" # 常量放頂部def load_data():"""函數注釋&#xff1a;加載數據"""if os.path.exists(DB_PATH):with open(DB_PATH, "r"…

go設計模式

劉&#xff1a;https://www.bilibili.com/video/BV1kG411g7h4 https://www.bilibili.com/video/BV1jyreYKE8z 1. 單例模式 2. 簡單工廠模式 代碼邏輯&#xff1a; 原始&#xff1a;業務邏輯層 —> 基礎類模塊工廠&#xff1a;業務邏輯層 —> 工廠模塊 —> 基礎類模塊…

搭建數字化生態平臺公司:痛點與蚓鏈解決方案

在數字技術突飛猛進的當下&#xff0c;數字化生態平臺成為眾多企業實現創新發展、拓展業務版圖的 “秘密工具”。今天&#xff0c;咱們就一起來聊聊搭建這類平臺的公司&#xff0c;看看它們有啥獨特之處&#xff0c;又面臨哪些難題。 一、面臨的痛點 &#xff08;一&#xff0…

標記符號“<”和“>”符號被稱為“尖括號”或“角括號”

你提到的“<”和“>”符號被稱為“尖括號”或“角括號”。它們常用于編程語言中表示類型參數&#xff08;如泛型&#xff09;、HTML標簽&#xff08;如<div>&#xff09;、數學中的不等式&#xff08;如< 5&#xff09;等。 好的&#xff0c;我來用通俗的方式解…

云平臺DeepSeek滿血版:引領AI推理革新,開啟智慧新時代

引言&#xff1a;人工智能的未來——云平臺的卓越突破 在當今科技飛速發展的時代&#xff0c;人工智能&#xff08;AI&#xff09;技術正深刻地改變著我們生活與工作方式的方方面面。作為AI領域的創新者與領航者&#xff0c;云平臺始終走在技術前沿&#xff0c;憑借無窮的熱情…

自然語言處理:文本規范化

介紹 大家好&#xff01;很高興又能在這兒和大家分享自然語言處理相關的知識了。在上一篇發布于自然語言處理&#xff1a;初識自然語言處理-CSDN博客為大家初步介紹了自然語言處理的基本概念。而這次&#xff0c;我將進一步深入這個領域&#xff0c;和大家聊聊自然語言處理中一…

HTTP非流式請求 vs HTTP流式請求

文章目錄 HTTP 非流式請求 vs 流式請求一、核心區別 服務端代碼示例&#xff08;Node.js/Express&#xff09;非流式請求處理流式請求處理 客戶端請求示例非流式請求&#xff08;瀏覽器fetch&#xff09;流式請求處理&#xff08;瀏覽器fetch&#xff09; Python客戶端示例&…

C語言機試編程題

編寫版本&#xff1a;vc2022 1.求最大/小值 #include<stdio.h> int main(){int a[50],n;int max, min;printf("請輸入您要輸入幾個數");scanf_s("%d", &n);printf("請輸入您要比較的%d個數\n",n);for (int i 0; i<n; i) {scanf_…

c++ 多個.cpp文件運行

目錄 方法 1&#xff1a;將其他文件中的 main 改為普通函數 方法 2&#xff1a;使用頭文件組織代碼 方法 3&#xff1a;條件編譯&#xff08;僅用于調試或特殊需求&#xff09; 方法 4&#xff1a;創建類或命名空間管理邏輯 在一個C項目中&#xff0c;多個.cpp文件不能同…

基于OFDR的層壓陸相頁巖油儲層中非對稱裂縫群傳播的分布式光纖監測

關鍵詞&#xff1a;OFDR、分布式光纖傳感、裂縫傳播 一. 概述 四川盆地涼高山組優質頁巖油儲層存在復雜的垂直重疊巖性&#xff0c;大陸頁巖油儲層存在發育層理&#xff0c;薄層和天然裂縫&#xff0c;對水平井多級壓裂技術的裂縫網絡形態控制和監測構成挑戰。本研究提出了一…

UniApp 按鈕組件 open-type 屬性詳解:功能、場景與平臺差異

文章目錄 引言一、open-type 基礎概念1.1 核心作用1.2 通用使用模板 二、主流 open-type 值詳解2.1 contact - 客服會話功能說明平臺支持代碼示例 2.2 share - 內容轉發功能說明平臺支持注意事項 2.3 getUserInfo - 獲取用戶信息功能說明平臺支持代碼示例 2.4 getPhoneNumber -…

【大模型】Ubuntu下 fastgpt 的部署和使用

前言 本次安裝的版本為 fastgpt:v4.8.8-fix2。 最新版本fastgpt:v4.8.20-fix2 問答時報錯&#xff0c;本著跑通先使用起來&#xff0c;就沒有死磕下去&#xff0c;后面bug解了再進行記錄。 ? github連接&#xff1a;https://github.com/labring/FastGPT fastgpt 安裝說明&…

【GenBI實戰】python腳本實現基于DeepSeek api的數據查詢和圖表可視化

寫在前面 生成式 BI (GenBI) 正在改變我們與數據交互的方式。它允許用戶使用自然語言提出問題&#xff0c;并自動獲得數據洞察&#xff0c;而無需編寫復雜的 SQL 查詢或手動創建圖表。本文將帶你動手實戰&#xff0c;使用 Python 和 DeepSeek API (或其他類似的大語言模型 API…

Web-to-Web和Server-to-Serve歸因方法

Web2Web 和 S2S 歸因方法 1. Web2Web 歸因方法 原理&#xff1a; Web2Web&#xff08;Web-to-Web&#xff09;歸因方法主要用于跟蹤用戶在網站之間的行為路徑。它通過瀏覽器中的Cookie或其他標識符來追蹤用戶在不同網站之間的行為&#xff0c;從而確定用戶轉化的路徑。 使用…

c++中迭代器和指針有什么區別?

在 C 中&#xff0c;迭代器和指針雖然在某些場景下有相似的行為&#xff0c;但它們在設計目的、功能和使用場景上有本質區別。以下是詳細對比和最佳實踐&#xff1a; 一、核心區別對比表 特征指針迭代器本質原生數據類型&#xff0c;直接存儲內存地址類對象&#xff0c;抽象容…

如何使用Docker搭建哪吒監控面板程序

哪吒監控(Nezha Monitoring)是一款自托管、輕量級的服務器和網站監控及運維工具,旨在為用戶提供實時性能監控、故障告警及自動化運維能力。 文檔地址:https://nezha.wiki/ 本章教程,使用Docker方式安裝哪吒監控面板,在此之前,你需要提前安裝好Docker. 我當前使用的操作系…

ONLYOFFICE + Ollama,本地AI模型的高效集成方案

這篇文章將繼續探討如何在 ONLYOFFICE 中連接并高效使用各類 AI 模型。今天的主角是 Ollama——一個專為本地部署和運行 AI 模型的平臺。如何使用 Ollama 并與 ONLYOFFICE 編輯器集成&#xff0c;利用其強大的 AI 模型處理文本任務。以下是詳細的操作步驟和使用方法。 關于 ONL…