1.25 - 零钱兑换 && 理解右值以及move的作用

目录

1.零钱兑换

a.核心思想

b.思路

c.步骤

2.理解右值以及move的作用

右值(rvalue)

[move 的作用](#move 的作用)


1.零钱兑换

322. 零钱兑换 - 力扣(LeetCode)https://leetcode.cn/problems/coin-change/

cpp 复制代码
class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        std::vector<int> dp(amount + 1, amount + 1);
        dp[0] = 0;
        for (int coin : coins) 
        {
            for (int j = coin; j <= amount; j++) 
            {
                dp[j] = std::min(dp[j], dp[j - coin] + 1);
            }
        }
        return dp[amount] > amount ? -1 : dp[amount];
    }
};

a.核心思想

这是一个典型的动态规划问题,类似于零钱兑换中的最少硬币数问题。我们可以使用动态规划的方法来解决,通过定义一个数组来记录凑成不同金额所需的最少硬币数,然后根据给定的硬币面额数组逐步更新这个数组。

b.思路

① 定义一个长度为 amount + 1 的数组 dp,其中 dp[i] 表示凑成金额 i 所需的最少硬币数。初始时,将 dp 数组的所有元素初始化为一个较大的值(例如 amount + 1),表示初始时无法凑成该金额,而 dp[0] = 0,因为凑成金额 0 不需要任何硬币。

② 遍历硬币面额数组 coins,对于每个硬币面额 coin,再从 coin 开始遍历到 amount,更新 dp[j] 的值,即 dp[j] = min(dp[j], dp[j - coin] + 1)

③ 最后,如果 dp[amount] 的值仍然是最初设置的较大值,说明无法凑成总金额 amount,返回 -1;否则返回 dp[amount]

c.步骤

① 初始化 dp 数组。

② 遍历硬币面额数组,更新 dp 数组。

③ 根据 dp[amount] 的值返回结果。

2.理解右值以及move的作用

右值(rvalue)

① 定义:不能取地址的临时值,如字面值、表达式结果、函数返回的临时对象等。

② 特点:生命周期短暂,通常只存在于当前表达式中,无法被修改(除非是右值引用绑定)。

move 的作用

① 核心功能:将左值强制转换为右值引用(T&&),触发移动语义(而非拷贝语义)。

② 意义:

  • 避免不必要的深拷贝(如容器、字符串、智能指针等资源持有类)。

  • 通过"窃取"资源(如内存指针、文件句柄)实现高效转移,提升性能。

  • 配合移动构造函数/移动赋值运算符,实现资源所有权的快速转移。

希望这些内容对大家有所帮助!

感谢大家的三连支持!

相关推荐
JieE21210 小时前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2121 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack202 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树2 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2122 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2122 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术3 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦3 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
clint4563 天前
C++进阶(1)——前景提要
c++