加油站(暴力+贪心)
生活随笔
收集整理的這篇文章主要介紹了
加油站(暴力+贪心)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
暴力方法
暴力的方法很明顯就是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開始一定不行。全局最優:找到可以跑一圈的起始位置」。
總結
以上是生活随笔為你收集整理的加油站(暴力+贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。