LeetCode加油站(貪心算法/暴力,分析其時間和空間復雜度)


題目描述

?

?一.原本暴力算法

最初的想法是:先比較gas數組和cost數組的大小,找到可以作為起始點的站點(因為如果你起始點的油還不能到達下一個站點,就不能作為起始點)。當找到過后,再去依次順序跑一圈,如果剩余的油為負數,再去尋找下一個滿足條件的起始站點。

class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int index = -1; //定義初始起點int left = 0; //定義剩余油量bool flag = false;int n = gas.size();//尋找起始位置for(int i = 0;i<n;i++){if(gas[i] < cost[i]) {continue;}else{index = i; int j = index;int count = 0;cout<<"index="<<index<<endl;while(true){j = j%n;cout<<"j="<<j<<endl;if(left < 0) {left = 0;break;}if(count == n){flag = true;return index;}left = left + gas[j] - cost[j];cout<<"left="<<left<<endl;count++;j++;}   }}//判斷if(flag){return index;}else{return -1;}}
};

?

但是代碼最后超時了!!

時間復雜度是O(N^2)?因為循環遍歷尋找起始站點,找到過后再去循環遍歷走一圈是O(N^2)的時間復雜度!

巧妙思路算法二能通過的

轉子大佬的代碼。

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

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

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

  • class Solution {
    public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int curSum = 0;int min = INT_MAX; // 從起點出發,油箱里的油量最小值for (int i = 0; i < gas.size(); i++) {int rest = gas[i] - cost[i];curSum += rest;if (curSum < min) {min = curSum;}}if (curSum < 0) return -1;  // 情況1if (min >= 0) return 0;     // 情況2// 情況3for (int i = gas.size() - 1; i >= 0; i--) {int rest = gas[i] - cost[i];min += rest;if (min >= 0) {return i;}}return -1;}
    };

    在這里時間復雜度O(N)

  • 空間復雜度O(1)沒有開辟新的空間

二.貪心算法

每個加油站的剩余量rest[i]為gas[i] - cost[i]。

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

class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int curSum = 0;int totalSum = 0;int start = 0;for (int i = 0; i < gas.size(); i++) {curSum += gas[i] - cost[i];totalSum += gas[i] - cost[i];if (curSum < 0) {   // 當前累加rest[i]和 curSum一旦小于0start = i + 1;  // 起始位置更新為i+1curSum = 0;     // curSum從0開始}}if (totalSum < 0) return -1; // 說明怎么走都不可能跑一圈了return start;}
};

時間復雜度O(N)?

轉載于代碼隨想錄,大佬的算法

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

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

相關文章

從數據倉庫到數據湖(下):熱門的數據湖開源框架

文章目錄 一、前言二、Delta Lake三、Apache Hudi四、Apache Iceberg五、Apache Paimon六、對比七、筆者觀點八、總結八、參考資料 一、前言 在上一篇從數據倉庫到數據湖(上)&#xff1a;數據湖導論文章中&#xff0c;我們簡單講述了數據湖的起源、使用原因及其本質。本篇文章…

Rust入門實戰 編寫Minecraft啟動器#4下載資源

首發于Enaium的個人博客 首先我們需要添加幾個依賴。 model { path "../model" } parse { path "../parse" } reqwest { version "0.12", features ["blocking", "json"] } file-hashing { version "0.1&quo…

Xshell 和寶塔有啥區別

Xshell 和寶塔是兩種不同類型的工具&#xff0c;具有以下顯著區別&#xff1a; 1. 功能和用途 Xshell&#xff1a;主要是一款用于遠程連接服務器的終端模擬軟件。它允許用戶通過 SSH 協議安全地連接到遠程服務器&#xff0c;并在終端中執行命令&#xff0c;進行服務器的管理和…

AI論文作圖——如何表示模型參數凍結狀態

一、LOGO &#x1f525; win10win11 ?? win10win11 二、注意事項&#xff1a; 根據電腦系統&#xff0c;選擇對應的版本。 參考&#xff1a; 【AI論文作圖】如何表示模型參數凍結狀態&#xff1f;

對稱加密和非對稱加密解析

目錄 一、對稱加密二、非對稱加密三、總結 對稱加密和非對稱加密是兩種主要的加密技術&#xff0c;它們在數據安全領域扮演著重要角色。 一、對稱加密 基本原理&#xff1a;對稱加密使用同一個密鑰進行加密和解密。這意味著如果A用某個密鑰加密了信息發送給B&#xff0c;那么B…

Redis數據庫筆記

一、 認識NoSQL SQLNoSQL數據結構結構化非結構化(鍵值類型(Redis)文檔類型(MongoDB)列類型(HBase)Graph類型(Neo4j))數據關聯關聯的無關聯查詢方式SQL查詢非SQL事務特性ACIDBASE存儲方式磁盤內存擴展性垂直水平使用場景數據結構固定;相關業務對數據安全性、一致性要…

【C++中resize和reserve的區別】

1. resize的用法 改變當前容器內含有元素的數量&#xff08;size()&#xff09;比如&#xff1a; vector<int> vct;int num vct.size();//之前的元素個數為num vct.resize(len);//現在的元素個數為len如果num < len &#xff0c;那么容器vct新增len - num個元素&am…

8-選擇靜態或共享庫

在本節中&#xff0c;我們將展示如何使用BUILD_SHARED_LIBS變量來控制add_library()的默認行為&#xff0c;并允許控制如何構建沒有顯式類型的庫(STATIC、SHARED、MODULE或OBJECT)。 要做到這一點&#xff0c;我們需要將BUILD_SHARED_LIBS添加到頂級的CMakeLists.txt中。我…

神經網絡中的激活函數

目錄 一、什么是激活函數&#xff1a;二、如何選擇激活函數&#xff1a;1.Sigmoid激活函數&#xff1a;2.線性激活函數&#xff1a;3.ReLU激活函數&#xff1a; 一、什么是激活函數&#xff1a; 激活函數是神經網絡中的一種函數&#xff0c;它在神經元中起到了非線性映射的作用…

最新 Kubernetes 集群部署 + flannel 網絡插件(保姆級教程,最新 K8S 版本)

資源列表 操作系統配置主機名IP所需插件CentOS 7.92C4Gk8s-master192.168.60.143flannel-cni-plugin、flannel、coredns、etcd、kube-apiserver、kube-controller-manager、kube-proxy、 kube-scheduler 、containerd、pause 、crictlCentOS 7.92C4Gk8s-node01192.168.60.144f…

gitee上傳和下載idea項目的流程

環境&#xff1a;idea2022 一、上傳項目 1、在gitee中新建一個倉庫。 2、打開所要上傳的項目的文件夾&#xff0c;點擊Git Bash&#xff0c;生成.git文件夾。 3、在idea中打開所要上傳的項目&#xff0c;在控制臺的Terminal菜單中&#xff0c;輸入git add . (注意&#xf…

安防綜合管理/視頻匯聚平臺EasyCVR視頻監控存儲技術:高效穩定的視頻數據保障方案

隨著科技的飛速發展&#xff0c;視頻監控已成為現代社會不可或缺的一部分。無論是城市治安、交通管理&#xff0c;還是商業安保、家庭監控&#xff0c;視頻監控都發揮著至關重要的作用。而在這背后&#xff0c;視頻監控存儲技術則是確保監控數據得以長期保存、高效檢索和可靠利…

「C++系列」C++ 修飾符類型

文章目錄 一、C 修飾符類型1. 訪問修飾符&#xff08;Access Modifiers&#xff09;2. 存儲類修飾符&#xff08;Storage Class Specifiers&#xff09;3. 類型修飾符&#xff08;Type Modifiers&#xff09;4. 函數修飾符 二、C 修飾符類型-案例1. 訪問修飾符案例2. 存儲類修飾…

精講:java之多維數組的使用

一、多維數組簡介 1.為什么需要二維數組 我們看下面這個例子&#xff1f;“ 某公司2022年全年各個月份的銷售額進行登記。按月份存儲&#xff0c;可以使用一維數組。如果改寫為按季度為單位存儲怎么辦呢&#xff1f; 或許現在學習了一維數組的你只能申請四個一維數組去存儲每…

【福利】代碼公開!咸魚之王自動答題腳本

轉載請注明出處&#xff1a;小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你&#xff0c;歡迎[點贊、收藏、關注]哦~ 微信或QQ打開咸魚之王小程序&#xff0c;進入答題界面&#xff0c;運行main.py。期間不要動鼠標。 可自行更改代碼來適配自己的需求~ 可以按照示例圖片…

Kubernetes(k8s)和Docker Compose本質區別

Kubernetes&#xff08;k8s&#xff09;和Docker Compose是兩種不同的容器編排工具&#xff0c;它們有各自的特點和使用場景。 Kubernetes&#xff1a; Kubernetes是一個開源的容器編排平臺&#xff0c;用于自動化計算機軟件的部署、擴展和管理。它支持跨多個主機集群的容器化…

HarmonyOS Next 原生應用開發-從TS到ArkTS的適配規則(四)

一、不支持以#開頭的私有字段 規則&#xff1a;arkts-no-private-identifiers 級別&#xff1a;錯誤 ArkTS不支持使用#符號開頭聲明的私有字段。改用private關鍵字。 TypeScript class C {#foo: number 42 }ArkTS class C {private foo: number 42 }二、類型、命名空間的命…

深入了解線程鎖的使用及鎖的本質

文章目錄 線程鎖的本質局部鎖的使用 鎖的封裝及演示線程饑餓問題 線程加鎖本質可重入和線程安全死鎖問題 根據前面內容的概述, 上述我們已經知道了在linux下關于線程封裝和線程互斥,鎖的相關的概念, 下面就來介紹一下關于線程鎖的一些其他概念. 線程鎖的本質 當這個鎖是全局的…

Codeforces Round #956 (Div. 2) and ByteRace 2024

A. Array Divisibility 思路: 找出特例,發現輸出 1~&#x1d45b; 符合題意。直接輸出1~n即可. 代碼: #include<bits/stdc.h> using namespace std; typedef long long ll; #define N 1000005 ll dp[N], w[N], v[N], h[N]; ll dis[1005][1005]; ll a, b, c, n, m, t;…

iOS 開發技巧 - 使用本地 json 文件

前言 使用本地 json 文件的場景&#xff0c;在我們開發功能的階段&#xff0c;服務端接口字段定義好了后&#xff0c;有些接口響應很慢&#xff0c;請求到響應可能要 幾十秒甚至一分鐘&#xff0c;我們需要頻繁調用接口來調試功能&#xff1b;還有就是調用一些我們需要付費的三…