91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

代碼中是數(shù)學(xué)圖像解法和貪心解法

新材料在線 ? 來(lái)源:labuladong ? 作者:labuladong ? 2021-09-01 14:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

今天講一個(gè)貪心的老司機(jī)的故事,就是力扣第 134 題「加油站」:

5fda8eb2-fbbe-11eb-9bcf-12bb97331649.jpg

題目應(yīng)該不難理解,就是每到達(dá)一個(gè)站點(diǎn)i,可以加gas[i]升油,但離開(kāi)站點(diǎn)i需要消耗cost[i]升油,問(wèn)你從哪個(gè)站點(diǎn)出發(fā),可以兜一圈回來(lái)。

要說(shuō)暴力解法,肯定很容易想到,用一個(gè) for 循環(huán)遍歷所有站點(diǎn),假設(shè)為起點(diǎn),然后再套一層 for 循環(huán),判斷一下是否能夠轉(zhuǎn)一圈回到起點(diǎn):

int n = gas.length;

for (int start = 0; start 《 n; start++) {

for (int step = 0; step 《 n; step++) {

int i = (start + step) % n;

tank += gas[i];

tank -= cost[i];

// 判斷油箱中的油是否耗盡

}

}

很明顯時(shí)間復(fù)雜度是 O(N^2),這么簡(jiǎn)單粗暴的解法一定不是最優(yōu)的,我們?cè)噲D分析一下是否有優(yōu)化的余地。

暴力解法是否有重復(fù)計(jì)算的部分?是否可以抽象出「狀態(tài)」,是否對(duì)同一個(gè)「狀態(tài)」重復(fù)計(jì)算了多次?

我們前文 動(dòng)態(tài)規(guī)劃詳解 說(shuō)過(guò),變化的量就是「狀態(tài)」。那么觀察這個(gè)暴力窮舉的過(guò)程,變化的量有兩個(gè),分別是「起點(diǎn)」和「當(dāng)前油箱的油量」,但這兩個(gè)狀態(tài)的組合肯定有不下 O(N^2) 種,顯然沒(méi)有任何優(yōu)化的空間。

所以說(shuō)這道題肯定不是通過(guò)簡(jiǎn)單的剪枝來(lái)優(yōu)化暴力解法的效率,而是需要我們發(fā)現(xiàn)一些隱藏較深的規(guī)律,從而減少一些冗余的計(jì)算。

下面我們介紹兩種方法巧解這道題,分別是數(shù)學(xué)圖像解法和貪心解法。

圖像解法

汽車進(jìn)入站點(diǎn)i可以加gas[i]的油,離開(kāi)站點(diǎn)會(huì)損耗cost[i]的油,那么可以把站點(diǎn)和與其相連的路看做一個(gè)整體,將gas[i] - cost[i]作為經(jīng)過(guò)站點(diǎn)i的油量變化值:

這樣,題目描述的場(chǎng)景就被抽象成了一個(gè)環(huán)形數(shù)組,數(shù)組中的第i個(gè)元素就是gas[i] - cost[i]。

有了這個(gè)環(huán)形數(shù)組,我們需要判斷這個(gè)環(huán)形數(shù)組中是否能夠找到一個(gè)起點(diǎn)start,使得從這個(gè)起點(diǎn)開(kāi)始的累加和一直大于等于 0。

如何判斷是否存在這樣一個(gè)起點(diǎn)start?又如何計(jì)算這個(gè)起點(diǎn)start的值呢?

我們不妨就把 0 作為起點(diǎn),計(jì)算累加和的代碼非常簡(jiǎn)單:

int n = gas.length, sum = 0;

for (int i = 0; i 《 n; i++) {

// 計(jì)算累加和

sum += gas[i] - cost[i];

}

sum就相當(dāng)于是油箱中油量的變化,上述代碼中sum的變化過(guò)程可能是這樣的:

顯然,上圖將 0 作為起點(diǎn)肯定是不行的,因?yàn)閟um在變化的過(guò)程中小于 0 了,不符合我們「累加和一直大于等于 0」的要求。

那如果 0 不能作為起點(diǎn),誰(shuí)可以作為起點(diǎn)呢?

看圖說(shuō)話,圖像的最低點(diǎn)最有可能可以作為起點(diǎn):

如果把這個(gè)「最低點(diǎn)」作為起點(diǎn),就是說(shuō)將這個(gè)點(diǎn)作為坐標(biāo)軸原點(diǎn),就相當(dāng)于把圖像「最大限度」向上平移了。

再加上這個(gè)數(shù)組是環(huán)形數(shù)組,最低點(diǎn)左側(cè)的圖像可以接到圖像的最右側(cè):

這樣,整個(gè)圖像都保持在 x 軸以上,所以這個(gè)最低點(diǎn) 4,就是題目要求我們找的起點(diǎn)。

不過(guò),經(jīng)過(guò)平移后圖像一定全部在 x 軸以上嗎?不一定,因?yàn)檫€有無(wú)解的情況:

如果sum(gas[。..]) 《 sum(cost[。..]),總油量小于總的消耗,那肯定是沒(méi)辦法環(huán)游所有站點(diǎn)的。

綜上,我們就可以寫出代碼:

int canCompleteCircuit(int[] gas, int[] cost) {

int n = gas.length;

// 相當(dāng)于圖像中的坐標(biāo)點(diǎn)和最低點(diǎn)

int sum = 0, minSum = Integer.MAX_VALUE;

int start = 0;

for (int i = 0; i 《 n; i++) {

sum += gas[i] - cost[i];

if (sum 《 minSum) {

// 經(jīng)過(guò)第 i 個(gè)站點(diǎn)后,使 sum 到達(dá)新低

// 所以站點(diǎn) i + 1 就是最低點(diǎn)(起點(diǎn))

start = i + 1;

minSum = sum;

}

}

if (sum 《 0) {

// 總油量小于總的消耗,無(wú)解

return -1;

}

// 環(huán)形數(shù)組特性

return start == n ? 0 : start;

}

以上是觀察函數(shù)圖像得出的解法,時(shí)間復(fù)雜度為 O(N),比暴力解法的效率高很多。

下面我們介紹一種使用貪心思路寫出的解法,和上面這個(gè)解法比較相似,不過(guò)分析過(guò)程不盡相同。

貪心解法

用貪心思路解決這道題的關(guān)鍵在于以下這個(gè)結(jié)論:

如果選擇站點(diǎn)i作為起點(diǎn)「恰好」無(wú)法走到站點(diǎn)j,那么i和j中間的任意站點(diǎn)k都不可能作為起點(diǎn)。

比如說(shuō),如果從站點(diǎn)1出發(fā),走到站點(diǎn)5時(shí)油箱中的油量「恰好」減到了負(fù)數(shù),那么說(shuō)明站點(diǎn)1「恰好」無(wú)法到達(dá)站點(diǎn)5;那么你從站點(diǎn)2,3,4任意一個(gè)站點(diǎn)出發(fā)都無(wú)法到達(dá)5,因?yàn)榈竭_(dá)站點(diǎn)5時(shí)油箱的油量也必然被減到負(fù)數(shù)。

如何證明這個(gè)結(jié)論?

假設(shè)tank記錄當(dāng)前油箱中的油量,如果從站點(diǎn)i出發(fā)(tank = 0),走到j(luò)時(shí)恰好出現(xiàn)tank 《 0的情況,那說(shuō)明走到i, j之間的任意站點(diǎn)k時(shí)都滿足tank 》 0,對(duì)吧。

如果把k作為起點(diǎn)的話,相當(dāng)于在站點(diǎn)k時(shí)tank = 0,那走到j(luò)時(shí)必然有tank 《 0,也就是說(shuō)k肯定不能是起點(diǎn)。

拜托,從i出發(fā)走到k好歹tank 》 0,都無(wú)法達(dá)到j(luò),現(xiàn)在你還讓tank = 0了,那更不可能走到j(luò)了對(duì)吧。

綜上,這個(gè)結(jié)論就被證明了。

回想一下我們開(kāi)頭說(shuō)的暴力解法是怎么做的?

如果我發(fā)現(xiàn)從i出發(fā)無(wú)法走到j(luò),那么顯然i不可能是起點(diǎn)。

現(xiàn)在,我們發(fā)現(xiàn)了一個(gè)新規(guī)律,可以推導(dǎo)出什么?

如果我發(fā)現(xiàn)從i出發(fā)無(wú)法走到j(luò),那么i以及i, j之間的所有站點(diǎn)都不可能作為起點(diǎn)。

看到冗余計(jì)算了嗎?看到優(yōu)化的點(diǎn)了嗎?

這就是貪心思路的本質(zhì),如果找不到重復(fù)計(jì)算,那就通過(guò)問(wèn)題中一些隱藏較深的規(guī)律,來(lái)減少冗余計(jì)算。

根據(jù)這個(gè)結(jié)論,就可以寫出如下代碼:

int canCompleteCircuit(int[] gas, int[] cost) {

int n = gas.length;

int sum = 0;

for (int i = 0; i 《 n; i++) {

sum += gas[i] - cost[i];

}

if (sum 《 0) {

// 總油量小于總的消耗,無(wú)解

return -1;

}

// 記錄油箱中的油量

int tank = 0;

// 記錄起點(diǎn)

int start = 0;

for (int i = 0; i 《 n; i++) {

tank += gas[i] - cost[i];

if (tank 《 0) {

// 無(wú)法從 start 走到 i

// 所以站點(diǎn) i + 1 應(yīng)該是起點(diǎn)

tank = 0;

start = i + 1;

}

}

return start == n ? 0 : start;

}

這個(gè)解法的時(shí)間復(fù)雜度也是 O(N),和之前圖像法的解題思路有所不同,但代碼非常類似。

其實(shí),你可以把這個(gè)解法的思路結(jié)合圖像來(lái)思考,可以發(fā)現(xiàn)它們本質(zhì)上是一樣的,只是理解方式不同而已。

對(duì)于這種貪心算法,沒(méi)有特別套路化的思維框架,主要還是靠多做題多思考,將題目的場(chǎng)景進(jìn)行抽象的聯(lián)想,找出隱藏其中的規(guī)律,從而減少計(jì)算量,進(jìn)行效率優(yōu)化。

好了,這道題就講到這里,希望對(duì)你拓寬思路有幫助。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7337

    瀏覽量

    94814
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4970

    瀏覽量

    74018

原文標(biāo)題:當(dāng)老司機(jī)學(xué)會(huì)了貪心算法

文章出處:【微信號(hào):xincailiaozaixian,微信公眾號(hào):新材料在線】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    云端協(xié)同,效率翻倍——智慧園區(qū)變電所運(yùn)維新解法

    1、概述 ??變電所運(yùn)維云平臺(tái)可以看做是電力監(jiān)控系統(tǒng)的網(wǎng)絡(luò)應(yīng)用延伸,變電所運(yùn)維云平臺(tái)通過(guò)互聯(lián)網(wǎng),電力運(yùn)維人員通過(guò)手機(jī)可以隨時(shí)隨地了解園區(qū)配電系統(tǒng)的運(yùn)行情況,做到無(wú)人值守或者少人值守,同時(shí)可以監(jiān)測(cè)用能狀況、漏電、線纜異常發(fā)熱等,并可以通過(guò)APP下發(fā)派工任務(wù),閉環(huán)消缺流程,及時(shí)排除隱患。 2、參考標(biāo)準(zhǔn) DL/T 5430? ? 《無(wú)人值班變電站遠(yuǎn)方監(jiān)控中心設(shè)計(jì)技術(shù)規(guī)程》 ?程瑜 ? ?187 0211 2087 GB/T 2887? ? 《計(jì)算機(jī)場(chǎng)地通用規(guī)范》 Q/GDW 231?
    的頭像 發(fā)表于 01-22 13:40 ?160次閱讀
    云端協(xié)同,效率翻倍——智慧園區(qū)變電所運(yùn)維新<b class='flag-5'>解法</b>

    面對(duì)AI降維打擊,陳天橋的全新解法:人類必須“肉身進(jìn)化”

    “堅(jiān)船利炮已經(jīng)出現(xiàn)在地平線上,而我們還堅(jiān)持用大刀長(zhǎng)矛守港口。” 這是陳天橋在最新文章對(duì)當(dāng)前人類處境的驚人比喻。這里的“堅(jiān)船利炮”,指的是正在爆發(fā)的人工智能。與主流觀點(diǎn)擔(dān)憂AI搶走工作不同,陳天橋
    的頭像 發(fā)表于 01-16 17:11 ?848次閱讀

    深演智能入選艾瑞咨詢2025年國(guó)企業(yè)級(jí)AI應(yīng)用行業(yè)研究報(bào)告

    深演智能榮譽(yù)入選艾瑞咨詢發(fā)布的《2025年國(guó)企業(yè)級(jí)AI應(yīng)用行業(yè)研究報(bào)告》,并攜手客戶遇見(jiàn)小面展示了 AI 助力連鎖餐飲品牌的新解法,彰顯了其在中國(guó)企業(yè)級(jí) AI 決策領(lǐng)域的領(lǐng)先地位。
    的頭像 發(fā)表于 01-14 11:30 ?732次閱讀

    損耗↓15%!AI服務(wù)器電源變壓器解法新思路

    千赫茲甚至接近兆赫茲區(qū)間。 在這一過(guò)程,變壓器產(chǎn)品所承受的工作條件已明顯不同于傳統(tǒng)服務(wù)器時(shí)代。高頻化帶來(lái)的損耗放大、散熱受限以及寄生參數(shù)問(wèn)題,使變壓器產(chǎn)品逐漸成為制約電源系統(tǒng)進(jìn)一步優(yōu)化的重要變量。 在這樣的技術(shù)環(huán)境下,變壓器
    的頭像 發(fā)表于 01-07 13:54 ?358次閱讀
    損耗↓15%!AI服務(wù)器電源變壓器<b class='flag-5'>解法</b>新思路

    無(wú)萬(wàn)卡,不VLA:元戎啟行與阿里云的“想法”和“解法

    1980年代,卡內(nèi)基梅隆大學(xué)的機(jī)器人專家漢斯·莫拉維克(Hans Moravec)提出人工智能領(lǐng)域的一個(gè)悖論:讓計(jì)算機(jī)在邏輯推理、下棋等高級(jí)智力活動(dòng)達(dá)到甚至超越人類水平,相對(duì)容易;但要讓它具備孩童
    的頭像 發(fā)表于 11-12 09:28 ?467次閱讀
    無(wú)萬(wàn)卡,不VLA:元戎啟行與阿里云的“想法”和“<b class='flag-5'>解法</b>”

    上新 | 有限空間“新解法”!凌科LP20系列90°工業(yè)級(jí)連接器新品上市

    LP20系列90°連接器新品緊湊布線有了新選擇,90°結(jié)構(gòu)讓空間局限有了“新解法”。凌科LP20系列90°工業(yè)級(jí)連接器全新上線,為有限空間布線和轉(zhuǎn)角布線帶來(lái)全新連接解決方案。LP20系列90°連接器
    的頭像 發(fā)表于 11-04 18:12 ?492次閱讀
    上新 | 有限空間“新<b class='flag-5'>解法</b>”!凌科LP20系列90°工業(yè)級(jí)連接器新品上市

    Nuvoton_8051_ISP-ICP_Programmer_v7.15缺少ISP加載器的源代碼怎么解決?

    下載 nuvoton_8051_isp-icp_programmer_v7.15.zip 解壓縮為多個(gè) (~ 44) 加載器圖像文件,在目錄 (3) 新唐標(biāo)準(zhǔn)ISP代碼 但這些只是二進(jìn)制的 例如
    發(fā)表于 08-18 06:30

    鴻蒙非侵入式彈窗新解法,企查查正式開(kāi)源“QuickDialog”彈窗組件庫(kù)

    、可復(fù)用的設(shè)計(jì)理念,有望成為鴻蒙應(yīng)用開(kāi)發(fā)管理復(fù)雜彈窗場(chǎng)景的最佳實(shí)踐方案之一。 在當(dāng)前鴻蒙應(yīng)用開(kāi)發(fā),彈窗能力主要依賴 @CustomDialog 或 promptAction.openCustomDialog 等方案實(shí)現(xiàn)。這些方式雖然基礎(chǔ)能力齊全,但自定義彈窗的生命周期
    的頭像 發(fā)表于 07-31 10:40 ?735次閱讀
    鴻蒙非侵入式彈窗新<b class='flag-5'>解法</b>,企查查正式開(kāi)源“QuickDialog”彈窗組件庫(kù)

    炭黑含量測(cè)試儀在色母粒的應(yīng)用

    ,因此,精準(zhǔn)測(cè)定炭黑含量極為關(guān)鍵。?炭黑含量測(cè)試儀多采用高溫分解法,即在氮?dú)獾榷栊詺怏w保護(hù)下,將含有炭黑的色母粒試樣置于高溫環(huán)境。此時(shí),色母粒的有機(jī)基體,如塑料
    的頭像 發(fā)表于 07-23 10:32 ?437次閱讀
    炭黑含量測(cè)試儀在色母粒<b class='flag-5'>中</b>的應(yīng)用

    【微五科技CF5010RBT60開(kāi)發(fā)板試用體驗(yàn)】Cordic數(shù)學(xué)計(jì)算測(cè)試

    point in type e and f */ 支持的運(yùn)算如下,數(shù)據(jù)都是放大了32768,即左移15位。 測(cè)試代碼如下計(jì)算sin,硬件計(jì)算和math庫(kù)計(jì)算對(duì)比驅(qū)動(dòng)未完善,這里補(bǔ)充sin的計(jì)算
    發(fā)表于 06-27 23:55

    戴爾PowerEdge R7715服務(wù)器性能評(píng)測(cè)

    數(shù)據(jù)中心越來(lái)越“卷”,服務(wù)器也要“十八般武藝”,核心要多,內(nèi)存要快,接口要新,功耗還得低?這聽(tīng)起來(lái)像“不可能三角”,但戴爾PowerEdge R7715,用一臺(tái)機(jī)架,給出一體解法。
    的頭像 發(fā)表于 06-26 17:48 ?1797次閱讀
    戴爾PowerEdge R7715服務(wù)器性能評(píng)測(cè)

    基于LockAI視覺(jué)識(shí)別模塊:C++使用圖像的統(tǒng)計(jì)信息

    )。 COLOR_BGR2GRAY:將BGR圖像轉(zhuǎn)換為灰度圖像。 返回值: 無(wú)。最后結(jié)果儲(chǔ)存在grayImage。注意: 其中根據(jù)不同的轉(zhuǎn)換要求可以使用不同的轉(zhuǎn)換代碼,具體如下所示
    發(fā)表于 05-08 10:31

    技術(shù)分享 | 高逼真合成數(shù)據(jù)助力智駕“看得更準(zhǔn)、學(xué)得更快”

    自動(dòng)駕駛研發(fā)如何高效獲取海量訓(xùn)練數(shù)據(jù)?高逼真合成數(shù)據(jù)技術(shù)正在提供新解法。通過(guò)仿真平臺(tái)可生成多場(chǎng)景、多傳感器的精準(zhǔn)標(biāo)注數(shù)據(jù)。文章詳解如何構(gòu)建符合nuScenes標(biāo)準(zhǔn)的數(shù)據(jù)集,覆蓋復(fù)雜交通場(chǎng)景,為感知模型訓(xùn)練提供高效、可控的數(shù)據(jù)支持。
    的頭像 發(fā)表于 04-29 10:47 ?3537次閱讀
    技術(shù)分享 | 高逼真合成數(shù)據(jù)助力智駕“看得更準(zhǔn)、學(xué)得更快”

    基于RV1126開(kāi)發(fā)板實(shí)現(xiàn)自學(xué)習(xí)圖像分類方案

    在RV1126開(kāi)發(fā)板上實(shí)現(xiàn)自學(xué)習(xí):在識(shí)別前對(duì)物體圖片進(jìn)行模型學(xué)習(xí),訓(xùn)練完成后通過(guò)算法分類得出圖像的模型ID。 方案設(shè)計(jì)邏輯流程圖,方案代碼分為分為兩個(gè)業(yè)務(wù)流程,主體代碼負(fù)責(zé)抓取、合成
    的頭像 發(fā)表于 04-21 13:37 ?11次閱讀
    基于RV1126開(kāi)發(fā)板實(shí)現(xiàn)自學(xué)習(xí)<b class='flag-5'>圖像</b>分類方案

    (專家著作,建議收藏)電機(jī)的數(shù)學(xué)研究方法

    本魯企圖系統(tǒng)地説明電機(jī)主要的、最新的數(shù)學(xué)研究方法。本需的材料在足夠的程度上已包括用于研究電機(jī)過(guò)渡狀態(tài)和穩(wěn)定 狀態(tài)的獨(dú)特范圓。這些材料應(yīng)用已經(jīng)廣泛流行的最新數(shù)學(xué)分析作為它 的湛礎(chǔ)。電機(jī)過(guò)渡狀態(tài)和穩(wěn)定狀
    發(fā)表于 04-01 15:02