目录
[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&&),触发移动语义(而非拷贝语义)。② 意义:
避免不必要的深拷贝(如容器、字符串、智能指针等资源持有类)。
通过"窃取"资源(如内存指针、文件句柄)实现高效转移,提升性能。
配合移动构造函数/移动赋值运算符,实现资源所有权的快速转移。
希望这些内容对大家有所帮助!
感谢大家的三连支持!