加油站

加油站

在一條環(huán)路上有 n 個(gè)加油站嗅回,其中第 i 個(gè)加油站有汽油 gas[i]升盒至。
你有一輛油箱容量無(wú)限的的汽車(chē),從第i個(gè)加油站開(kāi)往第i+1個(gè)加油站需要消耗汽油 cost[i]升盐捷。你從其中的一個(gè)加油站出發(fā),開(kāi)始時(shí)油箱為空阴孟。
給定兩個(gè)整數(shù)數(shù)組 gascost 喂击,如果你可以繞環(huán)路行駛一周,則返回出發(fā)時(shí)加油站的編號(hào)锌雀,否則返回 -1 蚂夕。如果存在解,則 保證 它是 唯一 的腋逆。

示例 1:

輸入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]
輸出: 3
解釋: 從 3 號(hào)加油站(索引為 3 處)出發(fā)婿牍,可獲得 4 升汽油。此時(shí)油箱有 = 0 + 4 = 4 升汽油
開(kāi)往 4 號(hào)加油站惩歉,此時(shí)油箱有 4 - 1 + 5 = 8 升汽油
開(kāi)往 0 號(hào)加油站等脂,此時(shí)油箱有 8 - 2 + 1 = 7 升汽油
開(kāi)往 1 號(hào)加油站俏蛮,此時(shí)油箱有 7 - 3 + 2 = 6 升汽油
開(kāi)往 2 號(hào)加油站,此時(shí)油箱有 6 - 4 + 3 = 5 升汽油
開(kāi)往 3 號(hào)加油站上遥,你需要消耗 5 升汽油搏屑,正好足夠你返回到 3 號(hào)加油站。
因此粉楚,3 可為起始索引辣恋。

暴力(超時(shí))
以每一個(gè)點(diǎn)作為起點(diǎn)試

public int canCompleteCircuit(int[] gas, int[] cost) {
    int n = gas.length;
    for (int i = 0; i < n; i++) {
        int remain = gas[i];
        int j = i;
        while (remain >= cost[j]) {
            remain -= cost[j];
            j = (j + 1) % n;
            remain += gas[j];
            if (i == j) {
                return i;
            }
        }
    }
    return -1;
}

優(yōu)化1(超時(shí))
暴力存在很多重復(fù)計(jì)算

設(shè)當(dāng)前在考慮從 i出發(fā),先初始化 j = i
* * * * * *
      ^
      i
      ^
      j
      
隨后 j 會(huì)進(jìn)行后移
* * * * * *
      ^ ^
      i j
      
繼續(xù)后移
* * * * * *
      ^   ^
      i   j
      
繼續(xù)后移
* * * * * *
^     ^   
j     i   

此時(shí) j 又回到了第 0 個(gè)位置,我們?cè)谥耙呀?jīng)考慮過(guò)了這個(gè)位置出發(fā)解幼。
如果之前考慮第 0 個(gè)位置的時(shí)候抑党,最遠(yuǎn)到了第 2 個(gè)位置。
那么此時(shí) j 就可以直接跳到第 2 個(gè)位置撵摆,同時(shí)加上當(dāng)時(shí)的剩余汽油底靠,繼續(xù)考慮
* * * * * *
    ^ ^   
    j i  
public int canCompleteCircuit(int[] gas, int[] cost) {
    int n = gas.length;
    // 從index出發(fā)能到達(dá)的最遠(yuǎn)位置和剩余的油量
    int[] farIndex = new int[n];
    int[] farIndexRemain = new int[n];
    Arrays.fill(farIndex, -1);
    for (int i = 0; i < n; i++) {
        int remain = gas[i];
        int j = i;
        while (remain >= cost[j]) {
            remain -= cost[j];
            j = (j + 1) % n;
            if (farIndex[j] != -1) {
                remain += farIndexRemain[j];
                j = farIndex[j];
            } else {
                remain += gas[j];
            }
            if (i == j) {
                return i;
            }
        }
        farIndex[i] = j;
        farIndexRemain[i] = remain;
    }
    return -1;
}

優(yōu)化2
我們考慮一下下邊的情況。

* * * * * *
^     ^
i     j

當(dāng)考慮 i 能到達(dá)的最遠(yuǎn)的時(shí)候特铝,假設(shè)是 j暑中。
那么 i + 1 到 j 之間的節(jié)點(diǎn)是不是就都不可能繞一圈了?
假設(shè) i + 1 的節(jié)點(diǎn)能繞一圈鲫剿,那么就意味著從 i + 1 開(kāi)始一定能到達(dá) j + 1鳄逾。
又因?yàn)閺?i 能到達(dá) i + 1,所以從 i 也能到達(dá) j + 1灵莲。
但事實(shí)上雕凹,i 最遠(yuǎn)到達(dá) j 。產(chǎn)生矛盾政冻,所以 i + 1 的節(jié)點(diǎn)一定不能繞一圈枚抵。同理,其他的也是一樣的證明明场。

所以下一次的 i 我們不需要從 i + 1 開(kāi)始考慮汽摹,直接從 j + 1 開(kāi)始考慮即可。

還有一種情況苦锨,就是因?yàn)榈竭_(dá)末尾的時(shí)候逼泣,會(huì)回到 0。

如果對(duì)于下邊的情況舟舒。

* * * * * *
  ^   ^
  j   i

如果 i 最遠(yuǎn)能夠到達(dá) j 拉庶,根據(jù)上邊的結(jié)論 i + 1 到 j 之間的節(jié)點(diǎn)都不可能繞一圈了。想象成一個(gè)圓魏蔗,所以 i 后邊的節(jié)點(diǎn)就都不需要考慮了砍的,直接返回 -1 即可。

貪心
首先如果總油量減去總消耗大于等于零那么一定可以跑完一圈莺治,說(shuō)明 各個(gè)站點(diǎn)的加油站 剩油量rest[i]相加一定是大于等于零的廓鞠。
每個(gè)加油站到到下一站的剩余量rest[i]為gas[i] - cost[i]帚稠。
i從0開(kāi)始累加rest[i],和記為curSum床佳,一旦curSum小于零滋早,說(shuō)明[0, i]區(qū)間都不能作為起始位置,起始位置從i+1算起砌们,再?gòu)?計(jì)算curSum杆麸。

public int canCompleteCircuit(int[] gas, int[] cost) {
    int n = gas.length;
    int totalSum = 0, curSum = 0;
    int start = 0;
    for (int i = 0; i < n; i++) {
        totalSum += gas[i] - cost[i];
        curSum += gas[i] - cost[i];
        if (curSum < 0) {
            start = i + 1;
            curSum = 0;
        }
    }
    return totalSum < 0 ? -1 : start;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市浪感,隨后出現(xiàn)的幾起案子昔头,更是在濱河造成了極大的恐慌,老刑警劉巖影兽,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揭斧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡峻堰,警方通過(guò)查閱死者的電腦和手機(jī)讹开,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)捐名,“玉大人旦万,你說(shuō)我怎么就攤上這事∠馓#” “怎么了成艘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贺归。 經(jīng)常有香客問(wèn)我狰腌,道長(zhǎng),這世上最難降的妖魔是什么牧氮? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮瑰枫,結(jié)果婚禮上踱葛,老公的妹妹穿的比我還像新娘。我一直安慰自己光坝,他們只是感情好尸诽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著盯另,像睡著了一般性含。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸳惯,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天商蕴,我揣著相機(jī)與錄音叠萍,去河邊找鬼。 笑死绪商,一個(gè)胖子當(dāng)著我的面吹牛苛谷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播格郁,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼腹殿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了例书?” 一聲冷哼從身側(cè)響起锣尉,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎决采,沒(méi)想到半個(gè)月后自沧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡织狐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年暂幼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片移迫。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旺嬉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厨埋,到底是詐尸還是另有隱情邪媳,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布荡陷,位于F島的核電站雨效,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏废赞。R本人自食惡果不足惜徽龟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望唉地。 院中可真熱鬧据悔,春花似錦、人聲如沸耘沼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)群嗤。三九已至菠隆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骇径。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工躯肌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人既峡。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓羡榴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親运敢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子校仑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 題目 在一條環(huán)路上有 N 個(gè)加油站,其中第 i 個(gè)加油站有汽油 gas[i] 升传惠。 你有一輛油箱容量無(wú)限的的汽車(chē)迄沫,...
    CryFace閱讀 510評(píng)論 0 1
  • 在一條環(huán)路上有 N 個(gè)加油站,其中第 i 個(gè)加油站有汽油 gas[i] 升卦方。你有一輛油箱容量無(wú)限的的汽車(chē)羊瘩,從第 i...
    Shimmer_閱讀 243評(píng)論 0 2
  • 題目鏈接難度:中等 類(lèi)型: 數(shù)組 在一條環(huán)路上有 N 個(gè)加油站,其中第 i 個(gè)加油站有汽油 g...
    wzNote閱讀 3,623評(píng)論 0 1
  • 題目描述 這是 LeetCode 上的 「134. 加油站」 盼砍,難度為 「中等」尘吗。 在一條環(huán)路上有N個(gè)加油站,其中...
    水三葉的刷題日記閱讀 282評(píng)論 0 0
  • 題目描述: 加油站_力扣 在一條環(huán)路上有 N 個(gè)加油站浇坐,其中第 i 個(gè)加油站有汽油 gas[i] 升睬捶。你有一輛油箱...
    仲夏_檸葉閱讀 166評(píng)論 0 0