golang实现剑指offer:动态规划题型

丑数

LeetCode 面试题49:丑数

题目描述

我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。

示例:

输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。

核心思想:

  • 动态规划

  • 三指针

解题思路:

  • 已知丑数只包含因子 2, 3, 5,因此第N个丑数一定是 前面某个丑数 * 某个因子(2,3,5)得到

  • 我们可以创建一个数组,里面的数字是排好序的丑数,里面的每一个丑数是前面的某丑数乘以2、3或者5得到的

  • 定义三个指针p2,p3,p5,它们指向的数字分别只 X 2,X3,X5

  • 每次基于p2,p3,p5指向的数字计算出三个丑数,取最小的minVal

  • 将minVal添加进数组

func nthUglyNumber(n int) int {
    if n < 1 {
        return 1
    }
    dp := make([]int, n)
    //第一个丑数,即1
    dp[0] = 1
    //三指针初始指向数组第一个元素
    p2, p3, p5 := 0, 0, 0
    cur := 1

    for cur < n {
        //计算丑数,取最小值
        minVal := min(dp[p2]*2, dp[p3]*3, dp[p5]*5)
        dp[cur] = minVal
        // 每次谁计算出来,谁的指针就后移一位
        if minVal == dp[p2]*2 {
            p2++
        }
        if minVal == dp[p3]*3 {
            p3++
        }
        if minVal == dp[p5]*5 {
            p5++
        }
        cur++
    }
    return dp[cur-1]
}

func min(a, b, c int) int {
    if a < b {
        if a < c {
            return a
        }
        return c
    }

    if b < c {
        return b
    }
    return c
}

礼物的最大价值

LeetCode 面试题47

题目描述:

在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

示例:

输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 12
解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物</pre>

核心思想:

  • 动态规划

  • 原地修改,使空间复杂度为O(1)

  • 从格子右下角开始计算

解题思路:

  • 明确一个点,当前格子只能向右,向下移动

  • 计算每个格子最大价值,顺序从右下角开始,从右到左,从下到上

  • 每个格子在计算时,它的右边格子,下边格子最大价值已计算完毕。

  • 当前格子最大价值 等于 当前格子价格 加上 max(右边格子最大价值,下边格子最大价值)

func maxValue(grid [][]int) int {
    row := len(grid)
    if row == 0 {
        return 0
    }
    col := len(grid[0])
    if col == 0 {
        return 0
    }
    //从格子最后一行开始
    for i := row - 1; i >= 0; i-- {
        //从最右边一列开始
        for j := col - 1; j >= 0; j-- {
            tmp1, tmp2 := 0, 0
            //获取右边格子的价值
            if j < col-1 {
                tmp1 = grid[i][j+1]
            }
            //获取下边格子的价值
            if i < row-1 {
                tmp2 = grid[i+1][j]
            }
            //比较,计算当前格子最大价值,原地修改
            grid[i][j] = grid[i][j] + max(tmp1, tmp2)
        }
    }
    return grid[0][0]
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,289评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 95,968评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 171,336评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,718评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,734评论 6 399
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,240评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,631评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,599评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,139评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,166评论 3 345
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,286评论 1 354
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,917评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,604评论 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,075评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,205评论 1 275
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,814评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,351评论 2 365