当前位置: 首页 > news >正文

【LeetCode 热题100】动态规划实战:打家劫舍、完全平方数与零钱兑换(LeetCode 198 / 279 / 322)(Go语言版)

💰 动态规划实战:打家劫舍、完全平方数与零钱兑换(LeetCode 198 / 279 / 322)

本篇博客一次性带你掌握三道 LeetCode 中经典的动态规划(DP)题目:

  • 🏠 198. 打家劫舍(House Robber)
  • 🟩 279. 完全平方数(Perfect Squares)
  • 💸 322. 零钱兑换(Coin Change)

它们覆盖了动态规划中的线性状态转移完全背包问题,以及最小子结构决策问题


🏠 一、198. 打家劫舍

📌 题目描述

一排房子,每个房子里有一定金额的钱,不能偷相邻的两个房子。求最多能偷多少钱?


💡 解题思路

这是一个典型的线性动态规划问题。

dp[i] 表示前 i 个房子最多能偷的钱:

  • 偷第 i 个房子 → 前 i - 2 个房子最大值 + nums[i]
  • 不偷第 i 个房子 → 前 i - 1 个房子最大值

状态转移方程为:

dp[i] = max(dp[i-1], dp[i-2] + nums[i])

✅ Go 实现(空间优化版)

func rob(nums []int) int {if len(nums) == 0 {return 0}if len(nums) == 1 {return nums[0]}prev, curr := 0, 0for _, num := range nums {prev, curr = curr, max(curr, prev+num)}return curr
}func max(a, b int) int {if a > b {return a}return b
}

🟩 二、279. 完全平方数

📌 题目描述

给你一个整数 n,将其表示为若干个完全平方数的和,求这些数的最少数量。


💡 解题思路

这是一个典型的完全背包问题。

  • 状态定义:dp[i] 表示组成 i 所需的最少平方数数量;
  • 状态转移:尝试每一个 j*j <= i 的平方数:
dp[i] = min(dp[i], dp[i - j*j] + 1)

✅ Go 实现

func numSquares(n int) int {dp := make([]int, n+1)for i := 1; i <= n; i++ {dp[i] = i // 最坏情况:1+1+1+...+1for j := 1; j*j <= i; j++ {dp[i] = min(dp[i], dp[i - j*j] + 1)}}return dp[n]
}func min(a, b int) int {if a < b {return a}return b
}

💸 三、322. 零钱兑换

📌 题目描述

给定不同面额的硬币 coins 和总金额 amount,求最少的硬币数量使得总金额为 amount。如果没有一种组合能组成,返回 -1。


💡 解题思路

也是典型的完全背包问题,区别在于:

  • 目标是最小硬币数
  • 状态定义:dp[i] 表示组成金额 i 所需最少的硬币数
  • 初始化:dp[0] = 0,其余为 inf(表示不可达)

状态转移方程:

dp[i] = min(dp[i], dp[i - coin] + 1)

✅ Go 实现

func coinChange(coins []int, amount int) int {dp := make([]int, amount+1)for i := 1; i <= amount; i++ {dp[i] = amount + 1}for _, coin := range coins {for i := coin; i <= amount; i++ {dp[i] = min(dp[i], dp[i - coin] + 1)}}if dp[amount] > amount {return -1}return dp[amount]
}

🔚 总结对比

题目本质状态定义特点
打家劫舍线性DPdp[i] 表示前 i 间房最多可偷金额不能连续取相邻元素
完全平方数完全背包dp[i] 表示组成 i 所需的最少平方数个数类似零钱兑换
零钱兑换完全背包dp[i] 表示组成金额 i 最少硬币数与完全平方数模型一致

📘 写在最后

这三道题虽然看起来背景完全不同,但本质上都属于一维动态规划问题,熟悉它们可以极大提升你解决复杂 DP 问题的能力。

建议继续练习类似题目:

    1. 打家劫舍 II(环形房屋)
    1. 三角形最小路径和
    1. 最长递增子序列


文章转载自:

http://PRaSq0M9.chbcj.cn
http://GBH1Q2Di.chbcj.cn
http://lJMOcASm.chbcj.cn
http://aD0aaxLX.chbcj.cn
http://CC6VlYCF.chbcj.cn
http://Na5lhpEx.chbcj.cn
http://4qQffLSB.chbcj.cn
http://2ztF5sEW.chbcj.cn
http://Z6H2deeB.chbcj.cn
http://BirVmAkL.chbcj.cn
http://0TfXD49Y.chbcj.cn
http://pkvzvivY.chbcj.cn
http://PD5pnGuH.chbcj.cn
http://grqNuywR.chbcj.cn
http://dVwDVsMj.chbcj.cn
http://14DQbA1b.chbcj.cn
http://3warvA9x.chbcj.cn
http://wNQtVJwd.chbcj.cn
http://LGjvbnB1.chbcj.cn
http://4bt0Wtyt.chbcj.cn
http://mK5av7PI.chbcj.cn
http://bzwJ6n0c.chbcj.cn
http://E6rczdL6.chbcj.cn
http://Gc9XgC28.chbcj.cn
http://uLAauX47.chbcj.cn
http://dMX7lRGC.chbcj.cn
http://3DNtt4xt.chbcj.cn
http://6kbAXt9d.chbcj.cn
http://Fha5oxyj.chbcj.cn
http://usauytCK.chbcj.cn
http://www.dtcms.com/a/227869.html

相关文章:

  • 【QT控件】QWidget 常用核心属性介绍 -- 万字详解
  • Laplace 噪声
  • 案例:TASK OA
  • YOLOv5 :训练自己的数据集
  • wow Warlock shushia [Dreadsteed]
  • 简单了解string类的特性及使用(C++)
  • MDP的curriculums部分
  • volatile,synchronized,原子操作实现原理,缓存一致性协议
  • 基于Python学习《Head First设计模式》第四章 工厂方法+抽象工厂
  • “等待-通知”机制优化(一次性申请)循环等待
  • HarmonyOS5 仓颉入门:和 ArkTs 互操作
  • 初识vue3(vue简介,环境配置,setup语法糖)
  • RGB888色彩格式转RGB565格式
  • VMware安装Ubuntu全攻略
  • 记忆解码 | 从神经机制到记忆逻辑的科学探索
  • Google机器学习实践指南(TensorFlow六大优化器)
  • Python----目标检测(Ultralytics安装和YOLO-V8快速上手)
  • 基于STM32控制直流电机加减速正反转设计
  • 自适应流量调度用于遥操作:面向时间敏感网络的通信与控制协同优化框架
  • OpenRouter使用指南
  • DeepSeek模型高级应用:提示工程与Few-shot学习实战指南
  • Origin将杂乱的分组散点图升级为美观的带颜色映射的气泡图
  • web架构3------(nginx的return跳转,gzip压缩,目录浏览,访问控制和location符号优先级)
  • 配置刷新技术
  • DAY01:【ML 第三弹】基本概念和建模流程
  • JS手写代码篇---手写类型判断函数
  • Python中三种不同包读取csv文件数据的方式:numpy、pandas、csv
  • Shell
  • android binder(三)binder.c函数分析
  • hadoop伪分布式配置(单机)