国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

代碼中是數學圖像解法和貪心解法

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

掃碼添加小助手

加入工程師交流群

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

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

題目應該不難理解,就是每到達一個站點i,可以加gas[i]升油,但離開站點i需要消耗cost[i]升油,問你從哪個站點出發,可以兜一圈回來。

要說暴力解法,肯定很容易想到,用一個 for 循環遍歷所有站點,假設為起點,然后再套一層 for 循環,判斷一下是否能夠轉一圈回到起點:

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];

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

}

}

很明顯時間復雜度是 O(N^2),這么簡單粗暴的解法一定不是最優的,我們試圖分析一下是否有優化的余地。

暴力解法是否有重復計算的部分?是否可以抽象出「狀態」,是否對同一個「狀態」重復計算了多次?

我們前文 動態規劃詳解 說過,變化的量就是「狀態」。那么觀察這個暴力窮舉的過程,變化的量有兩個,分別是「起點」和「當前油箱的油量」,但這兩個狀態的組合肯定有不下 O(N^2) 種,顯然沒有任何優化的空間。

所以說這道題肯定不是通過簡單的剪枝來優化暴力解法的效率,而是需要我們發現一些隱藏較深的規律,從而減少一些冗余的計算。

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

圖像解法

汽車進入站點i可以加gas[i]的油,離開站點會損耗cost[i]的油,那么可以把站點和與其相連的路看做一個整體,將gas[i] - cost[i]作為經過站點i的油量變化值:

這樣,題目描述的場景就被抽象成了一個環形數組,數組中的第i個元素就是gas[i] - cost[i]。

有了這個環形數組,我們需要判斷這個環形數組中是否能夠找到一個起點start,使得從這個起點開始的累加和一直大于等于 0。

如何判斷是否存在這樣一個起點start?又如何計算這個起點start的值呢?

我們不妨就把 0 作為起點,計算累加和的代碼非常簡單:

int n = gas.length, sum = 0;

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

// 計算累加和

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

}

sum就相當于是油箱中油量的變化,上述代碼中sum的變化過程可能是這樣的:

顯然,上圖將 0 作為起點肯定是不行的,因為sum在變化的過程中小于 0 了,不符合我們「累加和一直大于等于 0」的要求。

那如果 0 不能作為起點,誰可以作為起點呢?

看圖說話,圖像的最低點最有可能可以作為起點:

如果把這個「最低點」作為起點,就是說將這個點作為坐標軸原點,就相當于把圖像「最大限度」向上平移了。

再加上這個數組是環形數組,最低點左側的圖像可以接到圖像的最右側:

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

不過,經過平移后圖像一定全部在 x 軸以上嗎?不一定,因為還有無解的情況:

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

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

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

int n = gas.length;

// 相當于圖像中的坐標點和最低點

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) {

// 經過第 i 個站點后,使 sum 到達新低

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

start = i + 1;

minSum = sum;

}

}

if (sum 《 0) {

// 總油量小于總的消耗,無解

return -1;

}

// 環形數組特性

return start == n ? 0 : start;

}

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

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

貪心解法

用貪心思路解決這道題的關鍵在于以下這個結論:

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

比如說,如果從站點1出發,走到站點5時油箱中的油量「恰好」減到了負數,那么說明站點1「恰好」無法到達站點5;那么你從站點2,3,4任意一個站點出發都無法到達5,因為到達站點5時油箱的油量也必然被減到負數。

如何證明這個結論?

假設tank記錄當前油箱中的油量,如果從站點i出發(tank = 0),走到j時恰好出現tank 《 0的情況,那說明走到i, j之間的任意站點k時都滿足tank 》 0,對吧。

如果把k作為起點的話,相當于在站點k時tank = 0,那走到j時必然有tank 《 0,也就是說k肯定不能是起點。

拜托,從i出發走到k好歹tank 》 0,都無法達到j,現在你還讓tank = 0了,那更不可能走到j了對吧。

綜上,這個結論就被證明了。

回想一下我們開頭說的暴力解法是怎么做的?

如果我發現從i出發無法走到j,那么顯然i不可能是起點。

現在,我們發現了一個新規律,可以推導出什么?

如果我發現從i出發無法走到j,那么i以及i, j之間的所有站點都不可能作為起點。

看到冗余計算了嗎?看到優化的點了嗎?

這就是貪心思路的本質,如果找不到重復計算,那就通過問題中一些隱藏較深的規律,來減少冗余計算。

根據這個結論,就可以寫出如下代碼:

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) {

// 總油量小于總的消耗,無解

return -1;

}

// 記錄油箱中的油量

int tank = 0;

// 記錄起點

int start = 0;

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

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

if (tank 《 0) {

// 無法從 start 走到 i

// 所以站點 i + 1 應該是起點

tank = 0;

start = i + 1;

}

}

return start == n ? 0 : start;

}

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

其實,你可以把這個解法的思路結合圖像來思考,可以發現它們本質上是一樣的,只是理解方式不同而已。

對于這種貪心算法,沒有特別套路化的思維框架,主要還是靠多做題多思考,將題目的場景進行抽象的聯想,找出隱藏其中的規律,從而減少計算量,進行效率優化。

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

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7335

    瀏覽量

    94776
  • 代碼
    +關注

    關注

    30

    文章

    4968

    瀏覽量

    73977

原文標題:當老司機學會了貪心算法

文章出處:【微信號:xincailiaozaixian,微信公眾號:新材料在線】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    云端協同,效率翻倍——智慧園區變電所運維新解法

    1、概述 ??變電所運維云平臺可以看做是電力監控系統的網絡應用延伸,變電所運維云平臺通過互聯網,電力運維人員通過手機可以隨時隨地了解園區配電系統的運行情況,做到無人值守或者少人值守,同時可以監測用能狀況、漏電、線纜異常發熱等,并可以通過APP下發派工任務,閉環消缺流程,及時排除隱患。 2、參考標準 DL/T 5430? ? 《無人值班變電站遠方監控中心設計技術規程》 ?程瑜 ? ?187 0211 2087 GB/T 2887? ? 《計算機場地通用規范》 Q/GDW 231?
    的頭像 發表于 01-22 13:40 ?148次閱讀
    云端協同,效率翻倍——智慧園區變電所運維新<b class='flag-5'>解法</b>

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

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

    深演智能入選艾瑞咨詢2025年國企業級AI應用行業研究報告

    深演智能榮譽入選艾瑞咨詢發布的《2025年國企業級AI應用行業研究報告》,并攜手客戶遇見小面展示了 AI 助力連鎖餐飲品牌的新解法,彰顯了其在中國企業級 AI 決策領域的領先地位。
    的頭像 發表于 01-14 11:30 ?719次閱讀

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

    千赫茲甚至接近兆赫茲區間。 在這一過程,變壓器產品所承受的工作條件已明顯不同于傳統服務器時代。高頻化帶來的損耗放大、散熱受限以及寄生參數問題,使變壓器產品逐漸成為制約電源系統進一步優化的重要變量。 在這樣的技術環境下,變壓器
    的頭像 發表于 01-07 13:54 ?347次閱讀
    損耗↓15%!AI服務器電源變壓器<b class='flag-5'>解法</b>新思路

    無萬卡,不VLA:元戎啟行與阿里云的“想法”和“解法

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

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

    LP20系列90°連接器新品緊湊布線有了新選擇,90°結構讓空間局限有了“新解法”。凌科LP20系列90°工業級連接器全新上線,為有限空間布線和轉角布線帶來全新連接解決方案。LP20系列90°連接器
    的頭像 發表于 11-04 18:12 ?484次閱讀
    上新 | 有限空間“新<b class='flag-5'>解法</b>”!凌科LP20系列90°工業級連接器新品上市

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

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

    鴻蒙非侵入式彈窗新解法,企查查正式開源“QuickDialog”彈窗組件庫

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

    炭黑含量測試儀在色母粒的應用

    ,因此,精準測定炭黑含量極為關鍵。?炭黑含量測試儀多采用高溫分解法,即在氮氣等惰性氣體保護下,將含有炭黑的色母粒試樣置于高溫環境。此時,色母粒的有機基體,如塑料
    的頭像 發表于 07-23 10:32 ?428次閱讀
    炭黑含量測試儀在色母粒<b class='flag-5'>中</b>的應用

    【微五科技CF5010RBT60開發板試用體驗】Cordic數學計算測試

    point in type e and f */ 支持的運算如下,數據都是放大了32768,即左移15位。 測試代碼如下計算sin,硬件計算和math庫計算對比驅動未完善,這里補充sin的計算
    發表于 06-27 23:55

    戴爾PowerEdge R7715服務器性能評測

    數據中心越來越“卷”,服務器也要“十八般武藝”,核心要多,內存要快,接口要新,功耗還得低?這聽起來像“不可能三角”,但戴爾PowerEdge R7715,用一臺機架,給出一體解法
    的頭像 發表于 06-26 17:48 ?1783次閱讀
    戴爾PowerEdge R7715服務器性能評測

    基于LockAI視覺識別模塊:C++使用圖像的統計信息

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

    技術分享 | 高逼真合成數據助力智駕“看得更準、學得更快”

    自動駕駛研發如何高效獲取海量訓練數據?高逼真合成數據技術正在提供新解法。通過仿真平臺可生成多場景、多傳感器的精準標注數據。文章詳解如何構建符合nuScenes標準的數據集,覆蓋復雜交通場景,為感知模型訓練提供高效、可控的數據支持。
    的頭像 發表于 04-29 10:47 ?3528次閱讀
    技術分享 | 高逼真合成數據助力智駕“看得更準、學得更快”

    基于RV1126開發板實現自學習圖像分類方案

    在RV1126開發板上實現自學習:在識別前對物體圖片進行模型學習,訓練完成后通過算法分類得出圖像的模型ID。 方案設計邏輯流程圖,方案代碼分為分為兩個業務流程,主體代碼負責抓取、合成
    的頭像 發表于 04-21 13:37 ?11次閱讀
    基于RV1126開發板實現自學習<b class='flag-5'>圖像</b>分類方案

    模擬電路故障診斷

    本書主要介紹了故障字典法,元件參數解法,故障的預猜驗證法,逼近法,模擬電路故障診斷的現狀及發展趨勢。
    發表于 03-07 14:38