leetcode-134.加油站

題目

在一條環(huán)路上有 N 個(gè)加油站,其中第 i 個(gè)加油站有汽油 gas[i] 升芽偏。

你有一輛油箱容量無限的的汽車,從第 i 個(gè)加油站開往第 i+1 個(gè)加油站需要消耗汽油 cost[i] 升弦讽。你從其中的一個(gè)加油站出發(fā)污尉,開始時(shí)油箱為空。

如果你可以繞環(huán)路行駛一周往产,則返回出發(fā)時(shí)加油站的編號(hào)被碗,否則返回 -1。

說明:

  • 如果題目有解仿村,該答案即為唯一答案锐朴。
  • 輸入數(shù)組均為非空數(shù)組,且長度相同蔼囊。
  • 輸入數(shù)組中的元素均為非負(fù)數(shù)焚志。

題目鏈接:https://leetcode-cn.com/problems/gas-station

樣例

樣例1

輸入:
gas = [1,2,3,4,5]
cost = [3,4,5,1,2]

輸出: 3

解釋:
從 3 號(hào)加油站(索引為 3 處)出發(fā)衣迷,可獲得 4 升汽油。此時(shí)油箱有 = 0 + 4 = 4 升汽油
開往 4 號(hào)加油站酱酬,此時(shí)油箱有 4 - 1 + 5 = 8 升汽油
開往 0 號(hào)加油站壶谒,此時(shí)油箱有 8 - 2 + 1 = 7 升汽油
開往 1 號(hào)加油站,此時(shí)油箱有 7 - 3 + 2 = 6 升汽油
開往 2 號(hào)加油站膳沽,此時(shí)油箱有 6 - 4 + 3 = 5 升汽油
開往 3 號(hào)加油站汗菜,你需要消耗 5 升汽油,正好足夠你返回到 3 號(hào)加油站挑社。
因此陨界,3 可為起始索引。

樣例2

輸入:
gas = [2,3,4]
cost = [3,4,3]

輸出: -1

解釋:
你不能從 0 號(hào)或 1 號(hào)加油站出發(fā)滔灶,因?yàn)闆]有足夠的汽油可以讓你行駛到下一個(gè)加油站普碎。
我們從 2 號(hào)加油站出發(fā),可以獲得 4 升汽油录平。 此時(shí)油箱有 = 0 + 4 = 4 升汽油
開往 0 號(hào)加油站麻车,此時(shí)油箱有 4 - 3 + 2 = 3 升汽油
開往 1 號(hào)加油站,此時(shí)油箱有 3 - 3 + 3 = 3 升汽油
你無法返回 2 號(hào)加油站斗这,因?yàn)榉党绦枰?4 升汽油动猬,但是你的油箱只有 3 升汽油。
因此表箭,無論怎樣赁咙,你都不可能繞環(huán)路行駛一周。

解題思路

(1)暴力法

使用暴力是可以過免钻,題目說只有唯一答案彼水,我們就可以對(duì)每一個(gè)加油站進(jìn)行遍歷。如果該加油站能夠順利的走完一遍所有加油站的話极舔,那么該加油站就是唯一的一個(gè)答案凤覆。但是時(shí)間復(fù)雜度太高了,極端情況下需要對(duì)我們的站進(jìn)行雙重遍歷拆魏,即O(n2)的復(fù)雜度盯桦。參考代碼如下:

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        //思路:可以for循環(huán)對(duì)每個(gè)加油站進(jìn)行一次完整的模擬
        //時(shí)間復(fù)雜度大概為n^2,這是下策
        //具體實(shí)現(xiàn)思路渤刃,先對(duì)我們的gas和cost進(jìn)行復(fù)制拥峦,保證我們可以進(jìn)行一次循環(huán),即gas.length循環(huán)
        int[] doubleGas = new int[gas.length * 2];
        int[] doubleCost = new int[cost.length * 2];
        
        for(int i = 0; i < doubleGas.length; i++){
            doubleGas[i] = gas[i % gas.length];
            doubleCost[i] = cost[i % cost.length];
        }
        int res = -1;
        for(int i = 0; i < gas.length; i++){
            //只能從這里面每一個(gè)站進(jìn)行出發(fā)
            int need = 0; //開到下一個(gè)站所需要的汽油卖子,身在初始站略号,所以需要為0
            for(int j = i; j < i + gas.length; j++){
                //對(duì)后面站進(jìn)行加油并減去去下一個(gè)站的油,如果遇到油不夠的,則立即停止從那么再重新選一個(gè)出發(fā)點(diǎn)
                need += doubleGas[j];
                need -= doubleCost[j];
                if(need < 0) break;
                //如果剛好可以走完一個(gè)for循環(huán)玄柠,題目有唯一解氛琢,這就是答案
                if(j == (i + gas.length - 1)) res = i;
            }
        }
        return res;
    }
}

(2)貪心。上面的代碼總的來說随闪,看起來實(shí)在丑陋。不僅用了額外的空間骚勘,而且時(shí)間復(fù)雜還巨高铐伴。所以我們需要用貪心來寫這一題。其實(shí)就是暴力的原理然后進(jìn)行一定的優(yōu)化俏讹,需要我們?nèi)グl(fā)現(xiàn)一定的優(yōu)化規(guī)律当宴。

我們先來看一個(gè)例子,如下泽疆。

同樣的户矢,我們的加油站也是這樣的。如果一個(gè)加油站循環(huán)一周殉疼,也就是到達(dá)自己的位置梯浪,那么我們可以直接從它可以到達(dá)的最遠(yuǎn)位置的下一個(gè)位置作為出發(fā)點(diǎn)。如果找到可以循環(huán)一周的點(diǎn)的話瓢娜,那么這個(gè)點(diǎn)就是我們的唯一答案出發(fā)點(diǎn)挂洛。下面是參考代碼:

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int n = gas.length;
        for (int i = 0; i < n; i++) {
            int j = i;
            int res = gas[i];
            while (res - cost[j] >= 0) {  //汽油足夠消耗
                //減去我們消耗的,并加上下一個(gè)加油站給的油
                res += gas[(j + 1) % n] - cost[j];
                j = (j + 1) % n;
                //如果可以循環(huán)一周的話眠砾,說明這就是唯一答案
                if (j == i) return i;
            }
            //最遠(yuǎn)距離繞到了i之前虏劲,所以 i 后邊的點(diǎn)出發(fā)(i - n)都不可能繞一圈了,并且i之前肯定都是遍歷過的,所以直接無解褒颈。
            if (j < i) return -1;
            //i還是小于j(i <= j < n)柒巫,i 直接跳到 j,外層 for 循環(huán)執(zhí)行 i++谷丸,相當(dāng)于從 j + 1 開始考慮
            i = j;
        }
        //找不到唯一答案
        return -1;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末堡掏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子淤井,更是在濱河造成了極大的恐慌布疼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件币狠,死亡現(xiàn)場離奇詭異游两,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)漩绵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門贱案,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事宝踪∏仍悖” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵瘩燥,是天一觀的道長秕重。 經(jīng)常有香客問我,道長厉膀,這世上最難降的妖魔是什么溶耘? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮服鹅,結(jié)果婚禮上凳兵,老公的妹妹穿的比我還像新娘。我一直安慰自己企软,他們只是感情好庐扫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仗哨,像睡著了一般形庭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上藻治,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天碘勉,我揣著相機(jī)與錄音,去河邊找鬼桩卵。 笑死验靡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雏节。 我是一名探鬼主播胜嗓,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钩乍!你這毒婦竟也來了辞州?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤寥粹,失蹤者是張志新(化名)和其女友劉穎变过,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涝涤,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡媚狰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阔拳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崭孤。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辨宠,到底是詐尸還是另有隱情遗锣,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布嗤形,位于F島的核電站精偿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赋兵。R本人自食惡果不足惜还最,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毡惜。 院中可真熱鬧,春花似錦斯撮、人聲如沸经伙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帕膜。三九已至,卻和暖如春溢十,著一層夾襖步出監(jiān)牢的瞬間垮刹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國打工张弛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荒典,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓吞鸭,卻偏偏與公主長得像寺董,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刻剥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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

  • 134 Gas Station 加油站 Description:There are N gas stations ...
    air_melt閱讀 194評(píng)論 0 0
  • 加油站: 在一條環(huán)路上有 N 個(gè)加油站遮咖,其中第 i 個(gè)加油站有汽油 gas[i] 升。 你有一輛油箱容量無限的的汽...
    Buyun0閱讀 877評(píng)論 0 0
  • 本題考察的是最大子序列和 題目描述 在一條環(huán)路上有 N 個(gè)加油站造虏,其中第 i 個(gè)加油站有汽油 gas[i] 升御吞。你...
    小怪獸大作戰(zhàn)閱讀 1,983評(píng)論 0 1
  • 題目鏈接難度:中等 類型: 數(shù)組 在一條環(huán)路上有 N 個(gè)加油站,其中第 i 個(gè)加油站有汽油 g...
    wzNote閱讀 3,627評(píng)論 0 1
  • 題目 在一條環(huán)路上有 N 個(gè)加油站漓藕,其中第 i 個(gè)加油站有汽油 gas[i] 升陶珠。你有一輛油箱容量無限的的汽車,從...
    answerLDA閱讀 244評(píng)論 0 0