算法訓練營day29 貪心算法③ 134. 加油站、135. 分發糖果 、860.檸檬水找零、406.根據身高重建隊列

? ? ? ? 貪心算法的第三篇博客,繼續腦筋風暴!

134. 加油站

寫在前面

????????這道題規定了有解的話,必定為唯一解

貪心思路

直接從全局進行貪心選擇,情況如下:

  • 情況一:如果gas的總和小于cost總和,那么無論從哪里出發,一定是跑不了一圈的

  • 情況二:rest[i] = gas[i]-cost[i]為一天剩下的油,i從0開始計算累加到最后一站,如果累加沒有出現負數,說明從0出發,油就沒有斷過,那么0就是起點。

  • 情況三:如果累加的最小值是負數,汽車就要從非0節點出發,從后向前,看哪個節點能把這個負數填平,能把這個負數填平的節點就是出發節點。

????????這種解法其實說不出是什么方法,這就是一個從全局角度選取最優解的模擬操作。

class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:curSum = 0  # 當前累計的剩余油量minFuel = float('inf')  # 從起點出發,油箱里的油量最小值for i in range(len(gas)):rest = gas[i] - cost[i]curSum += restif curSum < minFuel:minFuel = curSumif curSum < 0:return -1  # 情況1:整個行程的總消耗大于總供給,無法完成一圈if minFuel >= 0:return 0  # 情況2:從起點出發到任何一個加油站時油箱的剩余油量都不會小于0,可以從起點出發完成一圈for i in range(len(gas) - 1, -1, -1):rest = gas[i] - cost[i]minFuel += restif minFuel >= 0:return i  # 情況3:找到一個位置使得從該位置出發油箱的剩余油量不會小于0,返回該位置的索引return -1  # 無法完成一圈

貪心算法的另外一種理解

????????其實核心內容和上面的方法是一樣的,不過是沒有計算總油量盈余,轉而使用負數逼近的方法:

????????i從0開始累加rest[i],和記為curSum,一旦curSum小于零,說明[0, i]區間都不能作為起始位置,因為這個區間選擇任何一個位置作為起點,到i這里都會斷油,那么起始位置從i+1算起(重新作為起點),再從0計算curSum。

class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:curSum = 0  # 當前累計的剩余油量totalSum = 0  # 總剩余油量start = 0  # 起始位置for i in range(len(gas)):curSum += gas[i] - cost[i]totalSum += gas[i] - cost[i]if curSum < 0:  # 當前累計剩余油量curSum小于0start = i + 1  # 起始位置更新為i+1curSum = 0  # curSum重新從0開始累計if totalSum < 0:return -1  # 總剩余油量totalSum小于0,說明無法環繞一圈return start

for循環——常規思路

????????挨個作為起點累加計算,未出現負數即ok

class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:for i in range(len(cost)):rest = gas[i] - cost[i]  # 記錄剩余油量index = (i + 1) % len(cost)  # 下一個加油站的索引while rest > 0 and index != i:  # 模擬以i為起點行駛一圈(如果有rest==0,那么答案就不唯一了)rest += gas[index] - cost[index]  # 更新剩余油量index = (index + 1) % len(cost)  # 更新下一個加油站的索引if rest >= 0 and index == i:  # 如果以i為起點跑一圈,剩余油量>=0,并且回到起始位置return i  # 返回起始位置ireturn -1  # 所有起始位置都無法環繞一圈,返回-1

135. 分發糖果

????????本題采用了兩次貪心的策略:

  • 一次是從左到右遍歷,只比較右邊孩子評分比左邊大的情況。
  • 一次是從右到左遍歷,只比較左邊孩子評分比右邊大的情況。

????????這樣從局部最優推出了全局最優,即:相鄰的孩子中,評分高的孩子獲得更多的糖果。

class Solution:def candy(self, ratings: List[int]) -> int:n = len(ratings)candies = [1] * n# Forward pass: handle cases where right rating is higher than leftfor i in range(1, n):if ratings[i] > ratings[i - 1]:candies[i] = candies[i - 1] + 1# Backward pass: handle cases where left rating is higher than rightfor i in range(n - 2, -1, -1):if ratings[i] > ratings[i + 1]:candies[i] = max(candies[i], candies[i + 1] + 1)return sum(candies)

860.檸檬水找零

? ? ? ? 本以為累加即可,但其實是不對的,因為存在10美分和5美分的區別,所以不能混為一談

????????局部最優:遇到賬單20,優先消耗美元10,完成本次找零。全局最優:完成全部賬單的找零。

????????這道題告訴我們,不要總是想判斷總數,可以把每個單獨的數字列成參數,分別處理

class Solution:def lemonadeChange(self, bills: List[int]) -> bool:five = 0ten = 0twenty = 0for bill in bills:# 情況一:收到5美元if bill == 5:five += 1# 情況二:收到10美元if bill == 10:if five <= 0:return Falseten += 1five -= 1# 情況三:收到20美元if bill == 20:# 先嘗試使用10美元和5美元找零if five > 0 and ten > 0:five -= 1ten -= 1#twenty += 1# 如果無法使用10美元找零,則嘗試使用三張5美元找零elif five >= 3:five -= 3#twenty += 1else:return Falsereturn True

406.根據身高重建隊列

????????重點理解排序!這兩個排序很重要!

class Solution:def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:# 默認升序# -x[0]:對第一個值取負,實現降序排列(數值越大越靠前)。# x[1]:第二個值保持原值,實現升序排列(數值越小越靠前)。people.sort(key=lambda x: (-x[0], x[1]))que = []# 具體是先處理身高較高的,在身高相同的情況下,優先處理 k 值較小的。# 這兩個排序必不可少!!# 因為身高已經是高->低, 低對高無影響, 所以低身高直接根據K值插入即可# 同時相同K值, 需要從低->高依次處理, 因為后面的插入必須要在大索引的位置, 不能影響之前插入的元素for p in people:que.insert(p[1], p)# list.insert(index, element)# index:插入位置的索引# element:要插入的元素return que

底層實現補充(C++)

????????使用vector是非常費時的,C++中vector(可以理解是一個動態數組,底層是普通數組實現的)如果插入元素大于預先普通數組大小,vector底部會有一個擴容的操作,即申請兩倍于原先普通數組的大小,然后把數據拷貝到另一個更大的數組上。

????????所以使用vector(動態數組)來insert,是費時的,插入再拷貝的話,單純一個插入的操作就是O(n^2)了,甚至可能拷貝好幾次,就不止O(n^2)了。

? ? ? ? 可以使用鏈表代替

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

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

相關文章

【09】C#入門到精通——C# 結構體對齊 與 常用數據 對應關系

文章目錄1 C# 結構體對齊1.1 默認對齊方式1.2 節對齊方式設置1.3 偏移量設置2 C#與C/C之間類型的對應關系1 C# 結構體對齊 1.1 默認對齊方式 struct默認對齊方式&#xff0c;結構體長度必須是&#xff0c;最大成員長度的整數倍&#xff0c;所以下面結構體大小是 24 (實際占用…

pytest 測試報告生成方案有哪些?

在 pytest 中&#xff0c;除了 Allure 和 HTMLTestRunner&#xff0c;還有許多其他生成測試報告的方法和插件。以下是一些常用的方案及其特點&#xff1a;1. pytest-html&#xff08;官方推薦&#xff09;特點&#xff1a;輕量級、易集成&#xff0c;生成獨立的 HTML 報告。安裝…

Unity中EditorPrefs與PlayerPrefs對比分析

Unity中EditorPrefs與PlayerPrefs對比分析 EditorPrefs與PlayerPrefs是Unity引擎中用于數據持久化的兩個核心類&#xff0c;分別用于于編輯器擴展與游戲運行時場景。以下從設計目標、存儲位置、數據類型、生命周期、安全性、使用場景等方面展開對比&#xff0c;并結合代碼示例說…

藍光中的愧疚

藍光中的愧疚活動結束那晚&#xff0c;深圳的空氣吸飽了水汽&#xff0c;沉甸甸地壓在胸口。我站在西鄉社區活動中心冰涼的玻璃門外&#xff0c;目送著最后一個離開的王老師。她關掉門廳的燈&#xff0c;電子門鎖合攏時發出輕微卻尖銳的“嘀”聲&#xff0c;像一根細針扎在我緊…

Linux: network: wireshark: esp attempt to detec null-encrypted esp payloads

最近看到一個pcap文件&#xff0c;里面有esp協議包&#xff0c;而且是明文/沒有加密的消息&#xff0c;為什么wireshark沒有將esp上層的tcp/sip消息沒有解出來。 類似于Info列只有ESP的信息。后來選中了協議選項里的&#xff1a;attempt to detect/decode NULL encrypted ESP p…

10分鐘搭建腳手架:Spring Boot 3.2 + Vue3 前后端分離模板

10分鐘搭建腳手架&#xff1a;Spring Boot 3.2 Vue3 前后端分離模板一、項目結構設計二、后端搭建&#xff08;Spring Boot 3.2&#xff09;1. 快速初始化&#xff08;使用 Spring Initializr&#xff09;2. 核心配置application.yml跨域配置 CorsConfig.java3. 安全配置Secur…

【軌物方案】分布式光伏電站運維升級智能化系列:老電站的數智化重生

自2010年分布式光伏在國內興起以來&#xff0c;十余年間&#xff0c;市場裝機容量已實現飛躍式增長。長期以來&#xff0c;傳統的人工巡查和抄表模式是它們日常運維的主要手段。然而&#xff0c;隨著電站數量的激增和設備的老化&#xff0c;由此導致的事故頻發&#xff0c;使得…

RAG 技術深度面試題:架構、優化與實踐應用

1. RAG 基礎架構設計 問題&#xff1a;對比單階段檢索&#xff08;Single-stage Retrieval&#xff09;與兩階段檢索&#xff08;Two-stage Retrieval&#xff09;在 RAG 系統中的架構差異&#xff0c;說明在企業知識庫場景下為何優先選擇兩階段檢索&#xff1f; 答案&#xff…

yolov8通道級剪枝講解(超詳細思考版)

為了提升推理速度并降低部署成本&#xff0c;模型剪枝已成為關鍵技術。本文將結合實踐操作&#xff0c;講解YOLOv8模型剪枝的方法原理、實施步驟及注意事項。 雖然YOLOv8n版本本身參數量少、推理速度快&#xff0c;能滿足大多數工業檢測需求&#xff0c;但谷歌研究表明&#x…

JavaSE:隨機數生成

隨機數在游戲開發、密碼學、模擬測試等場景中扮演著關鍵角色。本文將深入探討Java中兩種主流的隨機數生成技術&#xff1a;Random類和Math.random()方法&#xff0c;并解析背后的類與對象概念&#xff0c;助你全面掌握隨機數生成的核心機制。一、隨機數生成的兩大技術 Java提供…

Android 持久化存儲原理與使用解析

一、核心存儲方案詳解1. SharedPreferences (SP)使用方式&#xff1a;// 獲取實例 SharedPreferences sp getSharedPreferences("user_prefs", MODE_PRIVATE);// 寫入數據 sp.edit().putString("username", "john_doe").putInt("login_cou…

無 sudo 權限的環境下將 nvcc (CUDA Toolkit) 安裝到個人目錄 linux

要在無 sudo 權限的環境下將 nvcc 安裝到 home 個人目錄&#xff0c;你可以手動安裝 CUDA Toolkit 到你的 $HOME 目錄&#xff0c;只需以下幾步即可使用 nvcc 編譯 CUDA 程序。 ? 步驟&#xff1a;本地安裝 CUDA Toolkit&#xff08;含 nvcc&#xff09; 下載 CUDA Toolkit Ru…

從指標定義到AI執行流:衡石SENSE 6.0的BI PaaS如何重構ISV分析鏈路

一、痛點&#xff1a;ISV行業解決方案的“三重斷鏈”傳統ISV構建行業分析模塊時面臨的核心挑戰&#xff1a;指標定義碎片化&#xff1a;客戶A的“銷售額”含稅&#xff0c;客戶B不含稅&#xff0c;衍生指標無法復用&#xff1b;分析-執行割裂&#xff1a;發現庫存異常后需人工導…

構建跨平臺遠程醫療系統中的視頻通路技術方案探究

一、遠程醫療走向日常化&#xff0c;音視頻能力成為關鍵基礎設施 隨著醫療數字化與分級診療體系的不斷演進&#xff0c;遠程醫療正從試點探索階段&#xff0c;逐步邁向常態化、標準化應用。從縣域醫院遠程問診、基層醫療協作&#xff0c;到大型三甲醫院的術中協同、專科教學直…

Blackbox Exporter Docker 安裝配置,并與 Prometheus 集成

1. 創建配置文件目錄bashmkdir -p ~/docker/blackbox/config cd ~/docker/blackbox2. 創建 Blackbox Exporter 配置文件 config/blackbox.ymlyamlmodules:http_2xx: # HTTP 可用性檢測(響應 2xx/3xx 狀態碼)prober: httphttp:valid_http_versions: ["HTTP/1.1", &qu…

杰理通用MCU串口+AT指令+485通訊工業語音芯片

一、概述 在現代智能設備與自動化系統中&#xff0c;語音交互功能日益普及&#xff0c;通用 MCU 語音芯片作為核心組件&#xff0c;承擔著關鍵的語音處理任務。其強大的功能不僅體現在語音合成、識別等方面&#xff0c;還包括高效的通信能力。串口 AT 指令 485 通訊模式為通用…

Krpano 工具如何調節全景圖片切割之后的分辨率

文章目錄概要第一步1.1 復制一下這個文件中的key &#xff0c;打開 krpano Tools.exe第二步 修改切片之后的分辨率修改前的效果修改后的效果概要 前端渲染全景圖模擬3D場景 Krpano 工具 獲取到后的默認圖片分辨率是2048*2048的&#xff0c;如果覺得分辨率低了可以自行在工具中…

物聯網十大應用領域深度解析

一、智能物流技術基礎&#xff1a;RFID、無線傳感器網絡、互聯網與運籌學、供應鏈管理理論結合 應用場景&#xff1a;倉儲管理&#xff1a;RFID標簽實現庫存實時監控&#xff0c;自動補貨系統降低缺貨率。配送優化&#xff1a;通過GPS與物聯網數據分析規劃最優路徑&#xff0c;…

ElasticSearch基礎數據查詢和管理詳解

目錄 一、 ElasticSearch核心概念 1. 全文搜索&#xff08;Full-Text Search&#xff09; 2. 倒排索引&#xff08;Inverted Index&#xff09; 3. ElasticSearch常用術語 3.1 映射&#xff08;Mapping&#xff09; 3.2 索引&#xff08;Index&#xff09; 3.3 文檔&…

SSE與Websocket有什么區別?

SSE&#xff08;Server-Sent Events&#xff09;和WebSocket都能實現服務器與客戶端的實時通信&#xff0c;但它們在協議設計、應用場景和技術特性上有明顯差異。以下從多個維度對比兩者的區別&#xff1a; 1. 協議基礎 SSE 基于HTTP協議&#xff0c;是HTTP的擴展。使用單向通…