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&&),触发移动语义(而非拷贝语义)。

② 意义:

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

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

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

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

感谢大家的三连支持!

相关推荐
We་ct2 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·javascript·算法·leetcode·typescript
王老师青少年编程6 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮7 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
天疆说7 小时前
【哈密顿力学】深入解读航天器交会最优控制中的Hamilton函数
人工智能·算法·机器学习
wuweijianlove8 小时前
关于算法设计中的代价函数优化与约束求解的技术7
算法
leoufung8 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了8 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
HXDGCL8 小时前
矩形环形导轨:自动化循环线的核心运动单元解析
运维·算法·自动化
谭欣辰9 小时前
C++ 排列组合完整指南
开发语言·c++·算法
代码中介商9 小时前
银行管理系统的业务血肉 —— 流程、状态机、输入校验与持久化(下篇)
c语言·算法