日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

加油站(暴力+贪心)

發布時間:2024/4/18 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 加油站(暴力+贪心) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

暴力方法

暴力的方法很明顯就是O(n^2)的,遍歷每一個加油站為起點的情況,模擬一圈。

如果跑了一圈,中途沒有斷油,而且最后油量大于等于0,說明這個起點是ok的。

暴力的方法思路比較簡單,但代碼寫起來也不是很容易,關鍵是要模擬跑一圈的過程。

「for循環適合模擬從頭到尾的遍歷,而while循環適合模擬環形遍歷,要善于使用while!」

時間復雜度O(n^2) 空間復雜度O(n) class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {for (int i = 0; i < cost.size(); i++) {int rest = gas[i] - cost[i]; // 記錄剩余油量int index = (i + 1) % cost.size();while (rest > 0 && index != i) { // 模擬以i為起點行駛一圈rest += gas[index] - cost[index];index = (index + 1) % cost.size();}// 如果以i為起點跑一圈,剩余油量>=0,返回該起始位置if (rest >= 0 && index == i) return i;}return -1;} };

貪心解法

首先如果總油量減去總消耗大于等于零那么一定可以跑完一圈,說明各個站點的加油站 剩油量rest[i]相加最后一定是大于等于零的。

每個加油站的剩余量rest[i]為gas[i] - cost[i]。(通俗點,就是說我在當前加油站加gas[i]升油,去往下一個加油站要消耗掉cost[i]升油,那么我還可以剩余res[i]升油。)

i從0開始累加rest[i],和記為curSum,一旦curSum小于零,說明剩余的油不夠到達下一個加油站了,進而證明[0, i]區間都不能作為起始位置,起始位置從i+1算起,再從0計算curSum。


「那么局部最優:當前累加rest[j]的和curSum一旦小于0,起始位置至少要是j+1,因為從j開始一定不行。全局最優:找到可以跑一圈的起始位置」。

時間復雜度:O(n) 空間復雜度:O(1) class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int curSum = 0; //統計當前油桶剩余油量,若小于0,說明從當前加油站不能到達下一加油站了,必須更改起始點。int totalSum = 0;//統計從0開始到結束位置總剩余油量,最后發現<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;} };

總結

以上是生活随笔為你收集整理的加油站(暴力+贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。