• Golang每日一练(leetDay0075) 打家劫舍II、最短回文串


    目录

    213. 打家劫舍 II House Robber ii  🌟🌟

    214. 最短回文串 Shortest Palindrome  🌟🌟🌟

    🌟 每日一练刷题专栏 🌟

    Rust每日一练 专栏

    Golang每日一练 专栏

    Python每日一练 专栏

    C/C++每日一练 专栏

    Java每日一练 专栏


    213. 打家劫舍 II House Robber ii

    你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

    给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

    示例 1:

    输入:nums = [2,3,2]
    输出:3
    解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。
    

    示例 2:

    输入:nums = [1,2,3,1]
    输出:4
    解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
         偷窃到的最高金额 = 1 + 3 = 4 。

    示例 3:

    输入:nums = [1,2,3]
    输出:3
    

    提示:

    • 1 <= nums.length <= 100
    • 0 <= nums[i] <= 1000

    相关题目: 198. 打家劫舍 House Robber

    https://hannyang.blog.csdn.net/article/details/130663466#t1

    代码1: 动态规划

    1. package main
    2. import "fmt"
    3. func rob(nums []int) int {
    4. if len(nums) == 1 {
    5. return nums[0]
    6. }
    7. // 不偷第一个房屋
    8. prevMax := 0
    9. currMax := 0
    10. for _, num := range nums[1:] {
    11. temp := currMax
    12. currMax = max(currMax, prevMax+num)
    13. prevMax = temp
    14. }
    15. maxVal1 := currMax
    16. // 不偷最后一个房屋
    17. prevMax = 0
    18. currMax = 0
    19. for _, num := range nums[:len(nums)-1] {
    20. temp := currMax
    21. currMax = max(currMax, prevMax+num)
    22. prevMax = temp
    23. }
    24. maxVal2 := currMax
    25. return max(maxVal1, maxVal2)
    26. }
    27. func max(a, b int) int {
    28. if a > b {
    29. return a
    30. }
    31. return b
    32. }
    33. func main() {
    34. nums := []int{2, 3, 2}
    35. fmt.Println(rob(nums))
    36. nums = []int{1, 2, 3, 1}
    37. fmt.Println(rob(nums))
    38. nums = []int{1, 2, 3}
    39. fmt.Println(rob(nums))
    40. }

    代码2: 动态规划

    1. package main
    2. import "fmt"
    3. func rob(nums []int) int {
    4. if len(nums) == 1 {
    5. return nums[0]
    6. }
    7. return max(robRange(nums, 0, len(nums)-2), robRange(nums, 1, len(nums)-1))
    8. }
    9. func robRange(nums []int, start, end int) int {
    10. prevMax := 0
    11. currMax := 0
    12. for i := start; i <= end; i++ {
    13. temp := currMax
    14. currMax = max(currMax, prevMax+nums[i])
    15. prevMax = temp
    16. }
    17. return currMax
    18. }
    19. func max(a, b int) int {
    20. if a > b {
    21. return a
    22. }
    23. return b
    24. }
    25. func main() {
    26. nums := []int{2, 3, 2}
    27. fmt.Println(rob(nums))
    28. nums = []int{1, 2, 3, 1}
    29. fmt.Println(rob(nums))
    30. nums = []int{1, 2, 3}
    31. fmt.Println(rob(nums))
    32. }

    代码3: 动态规划

    1. package main
    2. import "fmt"
    3. func rob(nums []int) int {
    4. if len(nums) == 1 {
    5. return nums[0]
    6. } else if len(nums) == 2 {
    7. return max(nums[0], nums[1])
    8. }
    9. return max(robRange(nums[1:]), robRange(nums[:len(nums)-1]))
    10. }
    11. func robRange(nums []int) int {
    12. prevMax := 0
    13. currMax := nums[0]
    14. for i := 1; i < len(nums); i++ {
    15. temp := currMax
    16. currMax = max(currMax, prevMax+nums[i])
    17. prevMax = temp
    18. }
    19. return currMax
    20. }
    21. func max(a, b int) int {
    22. if a > b {
    23. return a
    24. }
    25. return b
    26. }
    27. func main() {
    28. nums := []int{2, 3, 2}
    29. fmt.Println(rob(nums))
    30. nums = []int{1, 2, 3, 1}
    31. fmt.Println(rob(nums))
    32. nums = []int{1, 2, 3}
    33. fmt.Println(rob(nums))
    34. }

    输出:

    3
    4
    3

    动态规划过程

    • 状态:dp[i] 表示偷窃前 i 个房屋的最大金额。

    • 转移方程:dp[i] = max(dp[i-1], dp[i-2]+nums[i-1])

      • 若偷窃第 i 个房屋,则不能偷窃第 i-1 个房屋,所以最大值为 dp[i-2]+nums[i-1]。
      • 若不偷窃第 i 个房屋,则最大值为 dp[i-1]。
    • 初始状态:dp[0] = 0 和 dp[1] = nums[0],因为只有一个房屋时最大金额为 nums[0]。

    • 最终结果:max(dp[len(nums)],dp[len(nums)-1])


    214. 最短回文串 Shortest Palindrome

    给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。

    示例 1:

    输入:s = "aacecaaa"
    输出:"aaacecaaa"
    

    示例 2:

    输入:s = "abcd"
    输出:"dcbabcd"
    

    提示:

    • 0 <= s.length <= 5 * 10^4
    • s 仅由小写英文字母组成

    代码1:

    1. package main
    2. import "fmt"
    3. func shortestPalindrome(s string) string {
    4. n := len(s)
    5. for i := n; i >= 1; i-- {
    6. if isPalindrome(s[:i]) {
    7. rev := reverse(s[i:])
    8. return rev + s
    9. }
    10. }
    11. return s
    12. }
    13. func isPalindrome(s string) bool {
    14. n := len(s)
    15. for i := 0; i < n/2; i++ {
    16. if s[i] != s[n-i-1] {
    17. return false
    18. }
    19. }
    20. return true
    21. }
    22. func reverse(s string) string {
    23. n := len(s)
    24. b := []byte(s)
    25. for i := 0; i < n/2; i++ {
    26. b[i], b[n-i-1] = b[n-i-1], b[i]
    27. }
    28. return string(b)
    29. }
    30. func main() {
    31. s := "aacecaaa"
    32. fmt.Println(shortestPalindrome(s))
    33. s = "abcd"
    34. fmt.Println(shortestPalindrome(s))
    35. }

    代码2:

    1. package main
    2. import "fmt"
    3. func shortestPalindrome(s string) string {
    4. rev := reverse(s)
    5. ns := s + "#" + rev
    6. n := len(ns)
    7. f := make([]int, n)
    8. for i, j := 1, 0; i < n; i++ {
    9. for j > 0 && ns[i] != ns[j] {
    10. j = f[j-1]
    11. }
    12. if ns[i] == ns[j] {
    13. j++
    14. }
    15. f[i] = j
    16. }
    17. return rev[:len(s)-f[n-1]] + s
    18. }
    19. func reverse(s string) string {
    20. n := len(s)
    21. b := []byte(s)
    22. for i := 0; i < n/2; i++ {
    23. b[i], b[n-i-1] = b[n-i-1], b[i]
    24. }
    25. return string(b)
    26. }
    27. func main() {
    28. s := "aacecaaa"
    29. fmt.Println(shortestPalindrome(s))
    30. s = "abcd"
    31. fmt.Println(shortestPalindrome(s))
    32. }

    输出:

    aaacecaaa
    dcbabcd


    🌟 每日一练刷题专栏 🌟

    持续,努力奋斗做强刷题搬运工!

    👍 点赞,你的认可是我坚持的动力! 

    🌟 收藏,你的青睐是我努力的方向! 

    评论,你的意见是我进步的财富!  

     主页:https://hannyang.blog.csdn.net/ 

    Rust每日一练 专栏

    (2023.5.16~)更新中...

    Golang每日一练 专栏

    (2023.3.11~)更新中...

    Python每日一练 专栏

    (2023.2.18~2023.5.18)暂停更

    C/C++每日一练 专栏

    (2023.2.18~2023.5.18)暂停更

    Java每日一练 专栏

    (2023.3.11~2023.5.18)暂停更

  • 相关阅读:
    JavaFX下载
    【LeetCode】2591.将钱分给最多的儿童
    (学习日记)2022.7.21
    T02 ExtractSubject 项目开发总结
    ros学习笔记(1)Mac本地安装虚拟机,安装Ros2环境
    【数据结构与算法】之堆的应用——堆排序及Top_K问题!
    仅个人记录:复现dotspatialdemo、打包、
    【Java EE】线程安全的集合类
    作为优秀的DBA,究竟需要掌握多少种数据库?
    yaml-cpp开源库使用
  • 原文地址:https://blog.csdn.net/boysoft2002/article/details/130833726