乐趣区

关于leetcode:Golang力扣Leetcode初级算法动态规划打家劫舍

题目
你是一个业余的小偷,打算偷窃沿街的屋宇。每间房内都藏有肯定的现金,影响你偷窃的惟一制约因素就是相邻的屋宇装有互相连通的防盗零碎,如果两间相邻的屋宇在同一早晨被小偷闯入,零碎会主动报警。
给定一个代表每个屋宇寄存金额的非负整数数组,计算你 不触动警报安装的状况下,一夜之内可能偷窃到的最高金额。

链接:力扣 Leetcode—高级算法—动静布局—打家劫舍.

示例 1

输出:[1,2,3,1]
输入:4
解释:偷窃 1 号屋宇 (金额 = 1),而后偷窃 3 号屋宇 (金额 = 3)。
            偷窃到的最高金额 = 1 + 3 = 4。

示例 2

输出:[2,7,9,3,1]
输入:12
解释:偷窃 1 号屋宇 (金额 = 2), 偷窃 3 号屋宇 (金额 = 9),接着偷窃 5 号屋宇 (金额 = 1)。
            偷窃到的最高金额 = 2 + 9 + 1 = 12。

标签:数组、动静布局

思路

  1. 遍历到第一个数,这是第一家,以他家作为完结,那就把他偷了
  2. 遍历到第二个数,咱们须要斟酌,如果第二家的财产更多就偷第二家,否则偷第一家
  3. 遍历到第三个数,咱们须要分对第三家是偷还是不偷
        偷第三家:那么第二家咱们就不能偷,所以咱们将第三家偷到的财产加上以第一家作为完结的最大财产,失去在截至第三家偷到所得的累加的总财产
        不偷第三家:那么咱们截至在第三家盗窃所得的总财产其实就是截至到第二家盗窃所得的总财产。
         比拟下面两种形式的大小,能够失去截至第三家累加的最大收益
  4. 遍历后续数组,每次只须要截至前两家的财产就能够计算出截至到以后家的最大收益
  5. 最初返回截至到最初一家的盗窃的收益

次要 Go 代码如下:

package main

import "fmt"

func rob(nums []int) int {n := len(nums)
    if n == 0 {return 0}
    if n == 1 {return nums[0]
    }
    if n > 1 {
        // 如果第一家大于第二家,那么就偷第一家,否则就偷第二家
        if nums[1] < nums[0] {nums[1] = nums[0]
        }
        if n > 2 {
            for i := 2; i < n; i++ {
                // 偷第 i 家
                if nums[i]+nums[i-2] >= nums[i-1] {nums[i] += nums[i-2]
                } else {
                    // 不偷第 i 家
                    nums[i] = nums[i-1]
                }
            }
        }
    }
    return nums[n-1]
}

func main() {a := []int{2, 7, 9, 3, 1}
    fmt.Println(rob(a))
}

提交截图

退出移动版