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

② 意义:

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

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

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

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

感谢大家的三连支持!

相关推荐
luj_176827 分钟前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
取地址符37 分钟前
C++学习笔记(基于learn-cxx)(1)
c++·经验分享·笔记·学习
tmlx3I0811 小时前
高光谱拼接算法(六)RANSAC 误匹配剔除
人工智能·算法·机器学习
不相心 -w-1 小时前
基础-滑动窗口-(定长 | 不定长)
算法
思麟呀1 小时前
C++17(三)if constexpr+折叠表达式
开发语言·c++
醉城夜风~1 小时前
Java详解经典算法题:接雨水(三种实现方案+原理剖析)
java·开发语言·算法
ysa0510301 小时前
【板子】ST表
c++·笔记·算法·板子
CHHH_HHH2 小时前
【C++11】深入解析C++可变参数模板
开发语言·c++·算法·stl·c++11
hurrycry_小亦2 小时前
洛谷题目:P1215 [USACO1.4] 母亲的牛奶 Mother‘s Milk 题解(本题简)
算法
十五年专注C++开发2 小时前
fatal error C1189: #error: WinSock.h has already been included 的解决方案
c++·socket·boost