国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

想要精通算法和SQL的成長之路 - 填充書架

這篇具有很好參考價值的文章主要介紹了想要精通算法和SQL的成長之路 - 填充書架。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

想要精通算法和SQL的成長之路 - 系列導航

一. 填充書架

原題鏈接
想要精通算法和SQL的成長之路 - 填充書架,精通算法和SQL之路,算法
想要精通算法和SQL的成長之路 - 填充書架,精通算法和SQL之路,算法
想要精通算法和SQL的成長之路 - 填充書架,精通算法和SQL之路,算法

題目中有一個值得注意的點就是:

  • 需要按照書本順序擺放。
  • 每一層當中,只要厚度不夠了,當前層最高的那一本書籍就視為本層的高度。

那么我們假設(shè)dp[i]: 代表從 book[0] 擺到 book[i] 的時書架的最小高度。

  • 假設(shè)最后一層的第一本書的下標是 j,那么之前所有書本擺放的最小高度就是 dp[j-1]。
  • 我們再計算出,下標在[j,i](最后一層)的書本中,高度最高的那一本書(同時滿足厚度不超過shelfWidth),高度為maxHeight。
  • 那么當前的最小總高度是 res = Max(dp[i-1]+maxHeight,res)。即之前的總高度+最后一層的最高高度。

我們遞歸,從后往前遞歸。入?yún)楸闅v的書本下標。

  1. 終止條件:下標 <0。代表沒有書本了,停止遞歸。
  2. 遞歸做的事情:循環(huán)[0,i]之間的所有元素,從后往前把書本放入最后一層,一旦厚度超出,終止遍歷。否則,計算當前層的最高高度以及最小總高。
public class Test1105 {
    public int[][] books;
    public int shelfWidth;

    public int minHeightShelves(int[][] books, int shelfWidth) {
        this.books = books;
        this.shelfWidth = shelfWidth;
        return dfs(books.length - 1);
    }

    public int dfs(int i) {
        // 終止條件
        if (i < 0) {
            return 0;
        }
        int res = Integer.MAX_VALUE, maxHeight = 0, width = shelfWidth;
        for (int j = i; j >= 0; j--) {
            // 從后往前放書本
            width -= books[j][0];
            // 厚度不能超過 shelfWidth ,超過就代表放不下了
            if (width < 0) {
                break;
            }
            // 當前層最高高度
            maxHeight = Math.max(maxHeight, books[j][1]);
            // 更新總最低書架高度 = 上層最小總高度 + 當前層最高高度
            res = Math.min(res, dfs(j - 1) + maxHeight);
        }
        return res;
    }
}

這個解答其實對于用例比較多的情況,是會超時的。

1.1 優(yōu)化

我們來看下上面代碼的不好的點:

  • 每次dfs的時候,循環(huán)的范圍是:[0,j]。
  • 循環(huán)內(nèi)部又每次調(diào)用了dfs遞歸,即dfs[j-1]

整個遞歸函數(shù),只用到了一個索引的參數(shù),我們可以發(fā)現(xiàn),索引為1,2,3…的遞歸,被重復調(diào)用了非常多次。以當前索引為3為例:

  • 第一次遞歸范圍:[0,3]。
  • 第二次遞歸范圍:[0,2]。
  • 第三次遞歸范圍:[0,1]。

那么我們可以用一個全局的變量去記錄每次dfs返回的結(jié)果即可:文章來源地址http://www.zghlxwxcb.cn/news/detail-733353.html

public class Test1105 {
    public int[][] books;
    public int shelfWidth;
    // 緩存dfs的結(jié)果
    public int[] dfsCache;

    public int minHeightShelves(int[][] books, int shelfWidth) {
        this.books = books;
        this.shelfWidth = shelfWidth;
        // 初始化
        dfsCache = new int[books.length];
        // 給個初始值,-1代表沒有被執(zhí)行過,即沒有緩存
        Arrays.fill(dfsCache, -1);
        return dfs(books.length - 1);
    }

    public int dfs(int i) {
        // 終止條件
        if (i < 0) {
            return 0;
        }
        // 如果是-1,代表這層值沒有執(zhí)行過,往下走。否則,說明有緩存了,直接返回
        if (dfsCache[i] != -1) {
            return dfsCache[i];
        }
        int res = Integer.MAX_VALUE, maxHeight = 0, width = shelfWidth;
        for (int j = i; j >= 0; j--) {
            // 從后往前放書本
            width -= books[j][0];
            // 厚度不能超過 shelfWidth ,超過就代表放不下了
            if (width < 0) {
                break;
            }
            // 當前層最高高度
            maxHeight = Math.max(maxHeight, books[j][1]);
            // 更新總最低書架高度 = 上層最小總高度 + 當前層最高高度
            res = Math.min(res, dfs(j - 1) + maxHeight);
        }
        // 緩存下當前結(jié)果
        dfsCache[i] = res;
        return dfsCache[i];
    }
}

到了這里,關(guān)于想要精通算法和SQL的成長之路 - 填充書架的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 想要精通算法和SQL的成長之路 - 分割數(shù)組的最大值

    想要精通算法和SQL的成長之路 - 分割數(shù)組的最大值

    想要精通算法和SQL的成長之路 - 系列導航 原題鏈接 首先面對這個題目,我們可以捕獲幾個: 非負整數(shù)。 非空連續(xù)子數(shù)組。 那么我們假設(shè)分割后的子數(shù)組,和的最大值是 M ,對應(yīng)分割的子數(shù)組個數(shù)為 N 。他們之間必然存在以下關(guān)系: 分割的子數(shù)組個數(shù) N 越多,對應(yīng)的

    2024年02月07日
    瀏覽(31)
  • 想要精通算法和SQL的成長之路 - 二叉樹的序列化和反序列化問題

    想要精通算法和SQL的成長之路 - 二叉樹的序列化和反序列化問題

    想要精通算法和SQL的成長之路 - 系列導航 二叉樹的層序遍歷 像這種從上至下并且按層打印的,可以稱之為 二叉樹的廣度優(yōu)先搜索( BFS ) 。而這類算法往往借助 隊列的一個先入先出特性 來實現(xiàn)。 那么有這么幾個步驟: 1.特殊處理還有初始化動作。 2. BFS 循環(huán): 最終完整代

    2024年02月07日
    瀏覽(31)
  • 【算法】Filling Bookcase Shelves 填充書架

    給定一個數(shù)組 books ,其中 b o o k s [ i ] = [ t h i c k n e s s i , h e i g h t i ] books[i] = [thicknessi, heighti] b oo k s [ i ] = [ t hi c kn ess i , h e i g h t i ] 表示第 i 本書的厚度和高度。你也會得到一個整數(shù) shelfWidth 。 按順序 將這些書擺放到總寬度為 shelfWidth 的書架上。 先選幾本書放在書架上

    2024年02月08日
    瀏覽(18)
  • 斗破蒼穹算法版—蕭炎的成長之路

    斗破蒼穹算法版—蕭炎的成長之路

    「作者主頁」 :雪碧有白泡泡 「個人網(wǎng)站」 :雪碧的個人網(wǎng)站 「推薦專欄」 : ★ java一站式服務(wù) ★ ★ 前端炫酷代碼分享 ★ ★ uniapp-從構(gòu)建到提升 ★ ★ 從0到英雄,vue成神之路 ★ ★ 解決算法,一個專欄就夠了 ★ ★ 架構(gòu)咱們從0說 ★ ★ 數(shù)據(jù)流通的精妙之道★ 蕭炎是一

    2024年02月16日
    瀏覽(10)
  • 斗破蒼穹算法——蕭炎的成長之路(二)

    斗破蒼穹算法——蕭炎的成長之路(二)

    「作者主頁」 :雪碧有白泡泡 「個人網(wǎng)站」 :雪碧的個人網(wǎng)站 「推薦專欄」 : ★ java一站式服務(wù) ★ ★ 前端炫酷代碼分享 ★ ★ uniapp-從構(gòu)建到提升 ★ ★ 從0到英雄,vue成神之路 ★ ★ 解決算法,一個專欄就夠了 ★ ★ 架構(gòu)咱們從0說 ★ ★ 數(shù)據(jù)流通的精妙之道★ 蕭炎是一

    2024年02月14日
    瀏覽(22)
  • 斗破蒼穹算法版—蕭炎的成長之路(一)

    斗破蒼穹算法版—蕭炎的成長之路(一)

    「作者主頁」 :雪碧有白泡泡 「個人網(wǎng)站」 :雪碧的個人網(wǎng)站 「推薦專欄」 : ★ java一站式服務(wù) ★ ★ 前端炫酷代碼分享 ★ ★ uniapp-從構(gòu)建到提升 ★ ★ 從0到英雄,vue成神之路 ★ ★ 解決算法,一個專欄就夠了 ★ ★ 架構(gòu)咱們從0說 ★ ★ 數(shù)據(jù)流通的精妙之道★ 蕭炎是一

    2024年02月16日
    瀏覽(13)
  • Dockerfile成長之路

    Dockerfile成長之路

    隨著業(yè)務(wù)架構(gòu)的整改,針對非容器化業(yè)務(wù)全部進行容器化改造,這就設(shè)計到了java寫的業(yè)務(wù)代碼構(gòu)建業(yè)務(wù)鏡像,并通過k8s發(fā)版,因此,就得學習如何使用dockerfile構(gòu)建后端業(yè)務(wù)鏡像,可能不止構(gòu)建后端代碼鏡像,例如前端寫的代碼也有可能構(gòu)建為鏡像。還有可能就是要在原有鏡像基礎(chǔ)上進

    2024年01月24日
    瀏覽(56)
  • 我的“測試開發(fā)”成長之路

    我的“測試開發(fā)”成長之路

    我相信,有很多測試人員會不斷問自己,自己到底要不要堅持做測試,測試的職業(yè)發(fā)展到底怎么樣?如果你還在迷茫,在到處找各種大牛問類似的問題,我希望這篇文章,你看完能夠結(jié)束你的這個煩惱,給你更多的指明方向,當然也有更多的壓力。 ?????? 這個問題,就像

    2024年02月02日
    瀏覽(18)
  • Android程序員成長之路

    Android程序員成長之路

    應(yīng)該熱愛學習Android知識 具備基本的自學能力和解決問題的能力 具備實踐能力 Java(基本) C/C++(進階) Kotlin(基本) Python(可選) 飛書學習路線圖 學習路線圖正在完善中... 當然讀者也可以提出寶貴建議。 我將會按照 Android學習路線圖 發(fā)布博客文章。 因本人才疏學淺,博客文章中難

    2024年02月09日
    瀏覽(27)
  • Spring成長之路—Spring MVC

    Spring成長之路—Spring MVC

    ????????在分享SpringMVC之前,我們先對MVC有個基本的了解。MVC(Model-View-Controller)指的是一種軟件思想,它將軟件分為三層:模型層、視圖層、控制層 ? ? ? ? 模型層即Model: 負責處理具體的業(yè)務(wù)和封裝實體類,我們所知的service層、pojo都屬于模型層 ? ? ? ? 視圖層即view:

    2024年01月21日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包