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

② 意义:

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

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

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

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

感谢大家的三连支持!

相关推荐
森林里的程序猿猿16 小时前
垃圾收集器ParNew&CMS与底层标记三色标记算法
java·jvm·算法
进击的小头16 小时前
第12篇:开环系统伯德图设计控制器
python·算法
weixin_4588726116 小时前
东华复试OJ二刷复盘13
数据结构·算法
TechPioneer_lp16 小时前
腾讯客户端开发岗位 LeetCode 高频题汇总(2026版)
算法·leetcode·面试·求职招聘·笔试·腾讯校招·leetcode高频题
夏日听雨眠16 小时前
数据结构1
数据结构·算法
jing-ya16 小时前
day 55 图论part7
java·数据结构·算法·图论
我爱我家88216 小时前
亚洲艺术电影节携澳门文化亮相深圳
人工智能·物联网·算法·区块链·爬山算法
Aawy12016 小时前
C++中的状态模式高级应用
开发语言·c++·算法
zyq99101_116 小时前
蓝桥杯刷题算法实战解析
数据结构·python·算法·蓝桥杯
sali-tec16 小时前
C# 基于OpenCv的视觉工作流-章39-FL特征匹配
图像处理·人工智能·opencv·算法·计算机视觉