python每日一題 貪心算法練習

在一條環路上有?n?個加油站,其中第?i?個加油站有汽油?gas[i]?升。

你有一輛油箱容量無限的的汽車,從第?i?個加油站開往第?i+1?個加油站需要消耗汽油?cost[i]?升。你從其中的一個加油站出發,開始時油箱為空。

給定兩個整數數組?gas?和?cost?,如果你可以按順序繞環路行駛一周,則返回出發時加油站的編號,否則返回?-1?。如果存在解,則?保證?它是?唯一?的。

我覺得我的思路很笨 就是找到第一個可以往下走的 如果可以順利的話 那么就OK 如果不順利 那么就繼續往下找 因為解是唯一的 所以只要找到直接return就行 雖然不確定是不是會超過時間限制 但是還是先試一下

我的大體思路就是:我往下找 找到第一個滿足的 就開始計算步數和余量 只要往下走就往下走 步數要走到n才行? 計算此時的索引就使用取模的方法 如果到了什么時候rem<0 那么就break 不然就step+=1 如果等于n了 那么就return i (反正要么就是while結束了 要么就是break了) 如果并沒有return i 那么就證明是這個不行 那要繼續往下選擇

那么重點來了 我要使用i+1嗎?顯然不是 因為我走了step步之后無法走下去 那么選擇i和i+step中間的是可以保證走下去的嗎?

跳過失敗路徑中的所有站點是貪心算法的關鍵優化點之一,它能將時間復雜度從 O(n2) 降到 O(n)。這不是因為“某一步負數太多”,而是因為整個路徑的凈收益是負的,意味著從任何子起點都無法完成一圈。所以繼續進行的就是i+step+1

但是我領會到其中的奧妙了 你想啊 我從中間的出發 根本到不了下一步 為什么? 我既然是走到這步才停 證明是因為前面的是有剩余的 到我這步又虧損了 虧損大了 才到不了 那你可能會覺得 誒 那我從虧損超級大的那一步往下走到不了嗎?你想啊 你既然是從虧損超級大的那一步往下走 既然可以往下走 就證明有剩余 有剩余都走不到這個step步 那中間的哪一個都不行(因為要想到達中間的某一步 任何一步 都是要有結余的 有結余還不行 那么我從頭開始更不行)我少了前面的補貼 還要面對后面的虧損 達咩達咩

好的來看代碼

class Solution(object):def canCompleteCircuit(self, gas, cost):i=0index=-1n=len(gas)while i <n:#如果當前的汽油不夠消耗到下一步的 就繼續往下找if gas[i]<cost[i]:i+=1continue#如果找到了這一個gas = [1,2,3,4,5], cost = [3,4,5,1,2]#現在是索引為3的地方 那么要是繼續往下走 就要滿足gas-cost+gas>=cost#計算剩余量和步數rem=0step=0while step<n:j = (i + step) % nrem += gas[j] - cost[j]if rem < 0:breakstep += 1if step==n:return i#證明這個i是不行的 那么我是需要走i+1的這一步的嗎?#不是的 因為我從i開始可以的 證明我i這步是有盈余的 既然走到這步不行了#那么就證明無論我從中間的哪一步開始 走到這步肯定都不行了 所以要跨過step這個步驟開始else:i=step+i+1return -1
solution=Solution()
result=solution.canCompleteCircuit([2,3,4], [3,4,3])
print(result)

但是這個運行速度只超過百分之三十多 所以我們來分析一下排名第一的代碼

首先就是計算總和 如果消耗總和大于油量總和 那直接不行?

然后就是直接計算盈余 一旦盈余小于0 改變開始的索引? 感覺這個for循環寫的還是挺深奧的 如果小于0的話 證明這個起點不行 那么是嘗試下一個這個我明白 但是為什么直接每個點開始計算結余呢?從第一個點開始 如果這個剩余小于0 那這個點不行 使用i+1這個點 如果是大于0的 那么這個點就不變 i繼續往下走 在這個過程中 只要這個剩余小于0 就證明這個包括這個中間的點都是不行的 (看我上面的解釋) 喵喵喵啊

class Solution(object):def canCompleteCircuit(self, gas, cost):""":type gas: List[int]:type cost: List[int]:rtype: int"""if sum(gas) < sum(cost):return -1cursum = 0start_idx = 0for i in range(len(gas)):cursum += gas[i] - cost[i]if cursum < 0:start_idx = i + 1cursum = 0return start_idx

如果喜歡這個帖子 歡迎點贊收藏!

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

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

相關文章

Python + Pika RabbitMQ集群壓測完整方案

一、最近搭建了個rabbitmq集群 三個磁盤節點&#xff0c;上生產環境之前想做個壓測&#xff0c;測試下穩定性&#xff0c;參考Deepseek做了如下測試方案二、核心代碼實現&#xff1a; 配置文件 (config.py) import os RABBITMQ_NODES [amqp://admin:123456192.168.0.175:8101,…

【第7話:相機模型3】自動駕駛IPM圖像投影拼接技術詳解及代碼示例

IPM圖像投影拼接技術詳解 IPM&#xff08;逆透視映射&#xff09;圖像投影拼接技術是一種在計算機視覺中廣泛應用的圖像處理方法&#xff0c;主要用于將多個透視視圖的圖像轉換為鳥瞰視圖并拼接成一個無縫的大場景圖像。該技術特別適用于自動駕駛、機器人導航和監控系統等領域&…

【測試工程思考】測試自動化基礎能力建設

1 回顧 傳統軟件研發體系下定義的軟件測試是從用戶視角設計的。測試是試圖窮盡用戶行為的工程&#xff0c;從測試用例&#xff08;use case&#xff09;的英文定義就可見一般。測試的邏輯資產就是用自然語言去描述用戶的操作行為或路徑。 但隨著軟件工程向分布式架構和敏捷交付…

進階向:AI聊天機器人(NLP+DeepSeek API)

什么是AI聊天機器人? AI聊天機器人是一種通過自然語言處理(NLP)技術模擬人類對話的智能程序系統。其核心是建立在機器學習算法和大型語言模型基礎上的對話引擎,能夠理解用戶的自然語言輸入,分析語境和意圖,并生成符合上下文的相關回復。 這類機器人系統通常包含以下幾個…

一個C#的段子

猜猜按鈕的結果是啥。 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } public static bool flag true; privat…

使用 gptqmodel 量化 Qwen3-Coder-30B-A3B-Instruct

代碼部分 : quantize_qwen3_coder_30b_a3b_instruct_gptq.py import os########## 環境變量設置 ########## # 當前可用的 CUDA 編號 os.environ["CUDA_VISIBLE_DEVICES"] "1" # GPU 顯存資源片段優化 os.environ["PYTORCH_CUDA_ALLOC_CONF"] …

基于python、django的疫苗接種管理系統

基于python、django的疫苗接種管理系統

Go語言實戰案例:使用sync.Map構建線程安全map

在并發編程中&#xff0c;共享資源的訪問是一個繞不開的問題。Go 中的 map 在并發讀寫時是不安全的&#xff0c;直接使用可能導致程序 panic。因此&#xff0c;在多協程同時訪問 Map 的場景下&#xff0c;必須采取有效的同步措施。本篇將通過一個實戰案例&#xff0c;介紹 Go 的…

關于vue2中對接海康攝像頭以及直播流rtsp或rtmp,后臺ffmpeg轉碼后通過ws實現

最近項目中需要對接攝像頭監控&#xff0c;海康攝像頭為rtsp流格式有一個軟件VLC media player&#xff0c;可以在線進行rtsp或者rtmp流播放&#xff0c;可用來測試流地址是否可用功能實現思路為后臺通過fmpeg把rtsp流進行轉碼&#xff0c;然后通過ws方式進行一幀一幀推送。&am…

Docker容器強制刪除及文件系統修復完整指南

Docker容器強制刪除及文件系統修復完整指南 故障現象與原因分析 ?故障表現?&#xff1a; ERROR: for c9ca40be974d_OpIsosMD_OB unable to remove filesystem unlinkat /data/docker/storage/containers/c9ca40be974d...: structure needs cleaning?根本原因?&#xff1a;…

Matplotlib 知識點總結

1. 基礎繪圖&#xff08;plot函數&#xff09;基本語法&#xff1a;plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)功能特點&#xff1a;可繪制點、線和組合圖形自動生成x軸&#xff08;0-N-1&#xff09;當x未指定時示例&#xff1a;繪制兩點連線、多點不規則線等代碼…

高可用微服務架構實戰:Nacos集群+Nginx負載均衡,Spring Cloud無縫對接

"當你的注冊中心掛了&#xff0c;整個微服務就變成了無頭蒼蠅。" 這是我在生產環境踩坑后最痛的領悟。今天&#xff0c;我將分享如何用Nacos集群Nginx搭建堅如磐石的注冊中心&#xff0c;讓你的微服務永不迷路&#xff01; 在 Windows 環境下配置 Nacos 集群&#x…

Spark大數據處理實戰指南

Spark 簡介 Apache Spark 是一個開源的分布式計算框架,專為大規模數據處理而設計。它通過內存計算和優化的執行引擎顯著提升了數據處理速度,適用于批處理、實時流處理、機器學習和圖計算等場景。 核心特性 高性能:利用內存計算(In-Memory Processing)減少磁盤 I/O,比傳…

瀏覽器緩存機制全解析:強緩存與協商緩存

瀏覽器緩存是瀏覽器為提升頁面加載速度、減少服務器壓力和節省網絡帶寬&#xff0c;在本地存儲資源&#xff08;如 HTML、CSS、JS、圖片等&#xff09;的機制。其核心分為強緩存和協商緩存&#xff0c;并涉及多種 HTTP 頭字段和存儲位置。以下是詳細解析&#xff1a;?? 一、緩…

知識隨記-----Qt 實用技巧:自定義倒計時按鈕防止用戶頻繁點擊

Qt 技巧&#xff1a;實現自定義倒計時按鈕防止用戶頻繁點擊注冊 項目場景 在一個基于 Qt 開發的聊天應用中&#xff0c;用戶注冊時需要獲取驗證碼。為防止用戶頻繁點擊獲取驗證碼按鈕&#xff0c;需要實現一個倒計時功能&#xff0c;用戶點擊后按鈕進入倒計時狀態&#xff0c;倒…

Linux與Windows應急響應

本人首先進行了linux的應急響應&#xff0c;windows之后再進行 Linux與Windows應急響應初體驗1 linux應急響應1.1 賬戶&#xff1a;1.1.1 使用cat /etc/passwd命令查看passwd文件2.1.2 使用cat /etc/shadow命令查找shadow文件&#xff0c;該文件為密碼文件的存儲項1.2 入侵排查…

計算機網絡1-4:計算機網絡的定義和分類

目錄 計算機網絡的定義 計算機網絡的分類 計算機網絡的定義 計算機網絡的分類 按交換技術分類&#xff1a;電路交換網絡、報文交換網絡、分組交換網絡 按使用者分類&#xff1a;公用網、專用網 按傳輸介質分類&#xff1a;有線網絡、無線網絡 按覆蓋范圍分類&#xff1a;…

在QT中動態添加/刪除控件,伸縮因子該怎么處理

開發中遇到的問題[TOC](開發中遇到的問題)處理方式在我們的界面開發過程中&#xff0c;通常需要開發一些可以動態添加or刪除控件的容器&#xff0c;類似Tab頁一樣&#xff0c;為了美觀的話&#xff0c;我們通常使用伸縮因子將容器中的控件往一個方向擠&#xff0c;類似下面的控…

【設計模式精解】什么是代理模式?徹底理解靜態代理和動態代理

目錄 靜態代理 動態代理 JDK動態代理 CGLIB代理 JDK動態代理和CGLIB代理的區別 總結 代理模式簡單來說就是 我們使用代理對象來代替對真實對象(real object)的訪問&#xff0c;這樣就可以在不修改原目標對象的前提下&#xff0c;擴展目標對象的功能。 代理模式有靜態代理…

MCU AI/ML - 彌合智能和嵌入式系統之間的差距

作者&#xff1a;芯科科技產品營銷高級經理Gopinath Krishniah 人工智能&#xff08;AI&#xff09;和機器學習&#xff08;ML&#xff09;是使系統能夠從數據中學習、進行推理并隨著時間的推移提高性能的關鍵技術。這些技術通常用于大型數據中心和功能強大的GPU&#xff0c;但…