chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(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é)圖像解法和貪心解法。

圖像解法

汽車(chē)進(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)的。

綜上,我們就可以寫(xiě)出代碼:

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),比暴力解法的效率高很多。

下面我們介紹一種使用貪心思路寫(xiě)出的解法,和上面這個(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é)論,就可以寫(xiě)出如下代碼:

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),和之前圖像法的解題思路有所不同,但代碼非常類(lèi)似。

其實(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)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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

    文章

    7256

    瀏覽量

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

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70766

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    模擬電路故障診斷

    本書(shū)主要介紹了故障字典法,元件參數(shù)解法,故障的預(yù)猜驗(yàn)證法,逼近法,模擬電路故障診斷的現(xiàn)狀及發(fā)展趨勢(shì)。
    發(fā)表于 03-07 14:38

    創(chuàng)建了用于OpenVINO?推理的自定義C++和Python代碼,從C++代碼獲得的結(jié)果與Python代碼不同是為什么?

    創(chuàng)建了用于OpenVINO?推理的自定義 C++ 和 Python* 代碼。 在兩個(gè)推理過(guò)程中使用相同的圖像和模型。 從 C++ 代碼獲得的結(jié)果與 Python*
    發(fā)表于 03-06 06:22

    Altium技術(shù)賦能Woodoo開(kāi)發(fā)新一代建筑材料

    解法國(guó)生物材料公司W(wǎng)oodoo如何使用Altium技術(shù)將木材可持續(xù)地轉(zhuǎn)化為獨(dú)特的新一代建筑材料。
    的頭像 發(fā)表于 02-28 16:17 ?577次閱讀

    IEEE新突破:數(shù)學(xué)解法引領(lǐng)光子晶體激光器創(chuàng)新

    反饋”)來(lái)增強(qiáng)光強(qiáng)度。當(dāng)光的強(qiáng)度達(dá)到所需的增益后,激光二極管就會(huì)釋放出強(qiáng)大的激光束。光子晶體表面發(fā)射激光器(PCSELs)作為先進(jìn)的激光二極管,它的光學(xué)增益主要沿著光在光子晶體(PC)結(jié)構(gòu)的傳播方向分布。與傳統(tǒng)激光器不同,PCSELs能
    的頭像 發(fā)表于 02-20 09:16 ?611次閱讀

    使用HAL庫(kù)寫(xiě)無(wú)人機(jī)遙控器的串口時(shí),串口沒(méi)有反應(yīng),NRF24L01無(wú)法和飛控進(jìn)行通信

    使用串口1 已排除硬件問(wèn)題(使用其他標(biāo)準(zhǔn)庫(kù)的串口文件測(cè)試printf輸出顯示沒(méi)有問(wèn)題) 且使用keil5的邏輯分析儀讀取CSN引腳有波形顯示 找了幾天沒(méi)找出來(lái)這個(gè)問(wèn)題的解法*附件:F1_Remote_1.0.zip
    發(fā)表于 01-27 23:08

    ADC14L040的內(nèi)部有保護(hù)電路嗎?

    各位大蝦同仁們,小弟設(shè)計(jì)了一個(gè)ADC14L040的電路,按照數(shù)據(jù)手冊(cè),其參考電壓應(yīng)該是1V(我用的是內(nèi)部參考,電路解法基本參照手冊(cè)),可是在實(shí)測(cè)為1.5V的直流參考,請(qǐng)問(wèn)這是為什么?還有,ADC14L040的內(nèi)部有保護(hù)電路嗎,當(dāng)我的輸入峰峰值超過(guò)4V時(shí),采集出來(lái)的數(shù)據(jù)
    發(fā)表于 01-08 07:47

    一文了解法蘭密封泄漏的原因

    今天小編和大家聊聊法蘭密封泄露的原因。 法蘭密封一般是依靠其連接螺栓所產(chǎn)生的預(yù)緊力,通過(guò)各種固體墊片(如:橡膠、石棉橡膠墊片、植物纖維墊片、纏繞式金屬內(nèi)填石棉墊片、波紋狀金屬內(nèi)填石棉墊片、波紋狀金屬夾殼內(nèi)填石棉墊片、波紋狀金屬墊片、平金屬夾殼內(nèi)填石棉墊片、槽形金屬墊片、突心金屬平墊片、金屬圓環(huán)墊片、金屬八角墊片等)或液體墊片(一定時(shí)間或一定條件下轉(zhuǎn)變成一定形狀的固體墊片)達(dá)到足夠的工作密封比壓,來(lái)阻止被密封
    的頭像 發(fā)表于 01-07 09:17 ?583次閱讀
    一文了<b class='flag-5'>解法</b>蘭密封泄漏的原因

    基于FPGA實(shí)現(xiàn)圖像直方圖設(shè)計(jì)

    直方圖統(tǒng)計(jì)的原理 直方圖統(tǒng)計(jì)從數(shù)學(xué)上來(lái)說(shuō),是對(duì)圖像的像素點(diǎn)進(jìn)行統(tǒng)計(jì)。圖像直方圖統(tǒng)計(jì)常用于統(tǒng)計(jì)灰度圖像,表示
    的頭像 發(fā)表于 12-24 10:24 ?790次閱讀
    基于FPGA實(shí)現(xiàn)<b class='flag-5'>圖像</b>直方圖設(shè)計(jì)

    DFT在圖像處理的作用 DFT在音頻信號(hào)處理的應(yīng)用

    DFT在圖像處理的作用 離散傅里葉變換(Discrete Fourier Transform,簡(jiǎn)稱DFT)是一種將信號(hào)從時(shí)域轉(zhuǎn)換到頻域的數(shù)學(xué)工具,它在圖像處理領(lǐng)域有著廣泛的應(yīng)用。以下
    的頭像 發(fā)表于 12-20 09:18 ?1262次閱讀

    傅立葉變換在圖像處理的作用

    傅里葉變換在圖像處理中發(fā)揮著至關(guān)重要的作用。以下是傅里葉變換在圖像處理的幾個(gè)主要作用: 一、圖像增強(qiáng)與去噪 去噪 :圖像
    的頭像 發(fā)表于 12-06 16:55 ?2310次閱讀

    安泰功率放大器在超聲霧化熱解法納米薄膜制備當(dāng)中應(yīng)用

    霧化研究,也有著良好應(yīng)用,今天Aigtek安泰電子就帶大家了解一下功率放大器在超聲霧化熱解法納米薄膜制備當(dāng)中應(yīng)用。 針對(duì)有機(jī)半導(dǎo)體粉料和金屬粉料蒸發(fā)溫度低的特點(diǎn),設(shè)計(jì)并制作了新型低溫輻射式薄膜加熱蒸發(fā)器,通過(guò)對(duì)有機(jī)
    的頭像 發(fā)表于 11-19 11:49 ?502次閱讀
    安泰功率放大器在超聲霧化熱<b class='flag-5'>解法</b>納米薄膜制備當(dāng)中應(yīng)用

    TPA3116D2/TPA3118D2 2.1的左右聲道,是否需要在前級(jí)把低頻部分濾除掉?

    按照datasheet的解法實(shí)現(xiàn)2.1聲道,一片做左右聲道,另一片做重低音,如下圖: 本人沒(méi)做過(guò)音頻方面的東西,對(duì)2.1不是很了解,現(xiàn)在有如下幾個(gè)問(wèn)題: 1、2.1的左右聲道,是否需要在前級(jí)把
    發(fā)表于 10-31 08:00

    華工激光推出新一代輪胎模具在線式激光清洗智能裝備

    雙碳目標(biāo)下,激光清洗正憑借其效率高、精確可控、綠色環(huán)保的特點(diǎn)廣泛應(yīng)用于輪胎、新能源、船舶等行業(yè),成為傳統(tǒng)清洗市場(chǎng)的新解法。
    的頭像 發(fā)表于 09-06 10:40 ?961次閱讀

    為什么有些TINA-TI仿真可以實(shí)現(xiàn)穩(wěn)態(tài)求解法分析,而有些不行?

    為什么有些TINA-TI仿真可以實(shí)現(xiàn)穩(wěn)態(tài)求解法分析,而有些不行,出現(xiàn)提示: ,無(wú)法執(zhí)行穩(wěn)態(tài)分析。 是有什么區(qū)別嗎?還是哪里需要設(shè)置嗎?
    發(fā)表于 08-08 08:28

    計(jì)算機(jī)視覺(jué)圖像融合

    在許多計(jì)算機(jī)視覺(jué)應(yīng)用(例如機(jī)器人運(yùn)動(dòng)和醫(yī)學(xué)成像),需要將多個(gè)圖像的相關(guān)信息整合到單一圖像。這種圖像融合可以提供更高的可靠性、準(zhǔn)確性和數(shù)據(jù)
    的頭像 發(fā)表于 08-01 08:28 ?1143次閱讀
    計(jì)算機(jī)視覺(jué)<b class='flag-5'>中</b>的<b class='flag-5'>圖像</b>融合