LeetCode-39 - 组合总和

面试题-排序数组中找两数之和为target的所有数的组合-leetcode167的变型题 题目描述: 给定排序数组arr,目标值target,寻找数组中所有和为target的数的组合,返回对应的索引。 题目没有说等于target的数对是否唯一,如果唯一,就是leetcode 167https://blog.youkuaiyun.com/orangefly0214/article/details/89155613 然而我也没有主动和面试官沟通题目,是否唯一,是否有重复的数,自己随手写了个数组{... 阅读详情

题目

<中等> 组合总和

来源:LeetCode.

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,
找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。
你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。
如果至少一个数字的被选数量不同,则两种组合是不同的。 
对于给定的输入,保证和为 target 的不同组合数少于 150 个。

示例 1:

输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。

示例 2:

输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]

示例3:

输入: candidates = [2], target = 1
输出: []

提示:

  • 1 < = n < = 30 1 <= n <= 30 1<=n<=30

接下来看一下解题思路:
在看这道题之前先回顾下 回溯算法
    回溯算法思想:
回朔法主要在于: 通过枚举法,对所有可能性进行遍历。 枚举的顺序是 一条路走到底,走到底之后,退一步,再向前尝试没走过的路。直到所有路都试过。因此回朔法可以简单的理解为: 走不通就退一步的枚举法就叫回朔法。而这里回退点也叫做回朔点。

回朔关键点 通过分析发现,回朔法实现的三大技术关键点分别是:
  • 一条路走到底
  • 回退一步
  • 另寻他路
关键点的实现 那么如何才能用代码实现上述三个关键点呢?
  • for 循环
  • 递归
解释如下

for循环的作用在于另寻他路: 可以用 f o r for for 循环可以实现一个路径选择器的功能,该路径选择器可以逐个选择当前节点下的所有可能往下走下去的分支路径。 例如: 像树的遍历一样,走到某个节点,该节点下可能有 i i i 个节点,需要遍历这所有可能的 i i i 个节点。

递归可以实现一条路走到底和回退一步: 一条路走到底: 递归意味着继续向着 f o r for for 给出的路径向下走一步。 如果把递归放在 f o r for for 循环内部,那么 f o r for for 每一次的循环,都在给出一个路径之后,进入递归,也就继续向下走了。直到递归出口(走无可走)为止。 那么这就是一条路走到底的实现方法。 递归从递归出口出来之后,就会实现回退一步。

因此 f o r for for 循环和递归配合可以实现回朔: 当递归从递归出口出来之后。上一层的 f o r for for 循环就会继续执行了。而 f o r for for 循环的继续执行就会给出当前节点下的下一条可行路径。而后递归调用,就顺着这条从未走过的路径又向下走一步。这就是回朔

如上的描述可以用代码总结下:
void dfs() {
    // 这条路走到底的条件。也是递归出口
    if (回朔点){
        // 保存该结果
        return;   
    }
    
    for () {
        //逐步选择当前节点下的所有可能route

        if (剪枝条件) {
            // 剪枝前的操作
            // 不继续往下走了,退回上层,换个路再走
            return;  
        }
        // 当前路径可能是条可行路径
        // 保存当前数据  
        add();
        // 递归发生,继续向下走一步了。
        dfs();
        // 回朔清理
        remove();
        // 该节点下的所有路径都走完了,清理堆栈,准备下一个递归。例如弹出当前节点
    }
}
思路一:搜索回溯:

    对于这类寻找所有可行解的题,都可以尝试用「搜索回溯」的方法来解决。
    定义递归函数 dfs ( target , combine , idx ) \textit{dfs}(\textit{target}, \textit{combine}, \textit{idx}) dfs(target,combine,idx) 表示当前在 candidates \textit{candidates} candidates 数组的第 idx \textit{idx} idx 位,还剩 target \textit{target} target 要组合,已经组合的列表为 combine \textit{combine} combine。递归的终止条件为 target ≤ 0 \textit{target} \le 0 target≤0 或者 candidates \textit{candidates} candidates 数组被全部用完。那么在当前的函数中,每次可以选择跳过不用第 idx \textit{idx} idx 个数,即执行 dfs ( target , combine , idx + 1 ) \textit{dfs}(\textit{target}, \textit{combine}, \textit{idx} + 1) dfs(target,combine,idx+1)。也可以选择使用第 idx \textit{idx} idx 个数,即执行 dfs ( target − candidates [ idx ] , combine , idx ) \textit{dfs}(\textit{target} - \textit{candidates}[\textit{idx}], \textit{combine}, \textit{idx}) dfs(target−candidates[idx],combine,idx),注意到每个数字可以被无限制重复选取,因此搜索的下标仍为 idx \textit{idx} idx。

class Solution {
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> combine = new ArrayList<>();
        dfs(candidates, target, result, combine, 0);
        return result;
    }

    public void dfs(int[] candidates, int target, List<List<Integer>> result, List<Integer> combine, int idx) {
        // 搜索完毕直接返回
        if (idx == candidates.length) {
            return;
        }
        // 符合条件保存结果
        if (target == 0) {
            result.add(new ArrayList<>(combine));
            return;
        }
        // 跳过数组当前元素
        dfs(candidates, target, result, combine, idx + 1);
        if (target - candidates[idx] >= 0) {
            combine.add(candidates[idx]);
            // 因为元素可以重复使用,所以传的是 idx
            dfs(candidates, target - candidates[idx], result, combine, idx);
            combine.remove(combine.size() - 1);
        }
    }
}
思路二:回溯算法 + 剪枝:

参考回溯经典例题详解
    从数组中寻找等于目标值的所有组合,可以使用目标值一次减去数组中的值,这个值可以重复使用,如果最后值为0,则是满足条件的组合,但是根据示例来看是 不计算顺序 的。如:[2, 2, 3], [2, 3, 2], [3, 2, 2] 都算 [2, 2, 3] 一种组合。
    根据这个思路,可以画出树形图,然后编码实现。
    以输入:candidates = [2, 3, 6, 7], target = 7 为例:
在这里插入图片描述

说明:
  • 以 t a r g e t = 7 target = 7 target=7 为 根结点 ,创建一个分支的时 做减法 ;
  • 每一个箭头表示:从父亲结点的数值减去边上的数值,得到孩子结点的数值。边的值就是题目中给出的 c a n d i d a t e candidate candidate 数组的每个元素的值;
  • 减到 0 0 0 或者负数的时候停止,即:结点 0 0 0 和负数结点成为叶子结点;
  • 所有从根结点到结点 0 0 0 的路径(只能从上往下,没有回路)就是题目要找的一个结果。
    这棵树有 4 4 4 个叶子结点的值 0 0 0,对应的路径列表是 [ [ 2 , 2 , 3 ] , [ 2 , 3 , 2 ] , [ 3 , 2 , 2 ] , [ 7 ] ] [[2, 2, 3], [2, 3, 2], [3, 2, 2], [7]] [[2,2,3],[2,3,2],[3,2,2],[7]],而示例中给出的输出只有 [ [ 7 ] , [ 2 , 2 , 3 ] ] [[7], [2, 2, 3]] [[7],[2,2,3]]。即:题目中要求每一个符合要求的解是 不计算顺序 的。下面我们分析为什么会产生重复。
分析重复路径产生的原因

    产生重复的原因是:在每一个结点,做减法,展开分支的时候,由于题目中说 每一个元素可以重复使用,考虑了 所有的 候选数,因此出现了重复的列表。

    遇到这一类相同元素不计算顺序的问题,在搜索的时候就需要 按某种顺序搜索。
    具体的做法是:每一次搜索的时候设置 下一轮搜索的起点 b e g i n begin begin,请看下图。
在这里插入图片描述
    从每一层的第 2 2 2 个结点开始,都不能再搜索产生同一层结点已经使用过的 c a n d i d a t e candidate candidate 里的元素。

class Solution {
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> combine = new ArrayList<>();
        dfs(candidates, target, result, combine, 0);
        return result;
    }

    public void dfs(int[] candidates, int target, List<List<Integer>> result, List<Integer> combine, int begin) {
        // target 为负数和 0 的时候不再产生新的孩子结点
        if (target < 0) {
            return;
        }

        // 回溯点,也是递归出口
        if (target == 0) {
            // 保存结果
            result.add(new ArrayList<>(combine));
            return;
        }

        for (int i = begin; i < candidates.length; ++i) {
            combine.add(candidates[i]);
            // 由于每一个元素可以重复使用,下一轮搜索的起点依然是 i,这里非常容易弄错
            dfs(candidates, target - candidates[i], result, combine, i);
            // 状态重置
            combine.remove(combine.size() - 1);
        }
    }
}
剪枝优化

    如果 target 减去一个数得到负数,那么减去一个更大的树依然是负数,同样搜索不到结果。基于这个想法,可以对输入数组进行排序,添加相关逻辑达到进一步剪枝的目的;

class Solution {
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> combine = new ArrayList<>();
        // 排序是剪枝的前提
        Arrays.sort(candidates);
        dfs(candidates, target, result, combine, 0);
        return result;
    }

    public void dfs(int[] candidates, int target, List<List<Integer>> result, List<Integer> combine, int begin) {
        // 回溯点,也是递归出口
        if (target == 0) {
            // 保存结果
            result.add(new ArrayList<>(combine));
            return;
        }

        for (int i = begin; i < candidates.length; ++i) {
            // 剪枝条件
            // 前提是候选数组已经有序
            if(target - candidates[i] < 0) {
                // 不继续往下走了,退回上层,换个路再走
                return;
            }
            combine.add(candidates[i]);
            dfs(candidates, target - candidates[i], result, combine, i);
            combine.remove(combine.size() - 1);
        }
    }
}
什么时候使用 used 数组,什么时候使用 begin 变量
  • 排列问题,讲究顺序(即 [2, 2, 3] 与 [2, 3, 2] 视为不同列表时),需要记录哪些数字已经使用过,此时用 used 数组;
  • 组合问题,不讲究顺序(即 [2, 2, 3] 与 [2, 3, 2] 视为相同列表时),需要按照某种顺序搜索,此时使用 begin 变量。
复杂度分析

时间复杂度: O ( S ) O(S) O(S),其中 S S S 为所有可行解的长度之和。从分析给出的搜索树可以看出时间复杂度取决于搜索树所有叶子节点的深度之和,即所有可行解的长度之和。在这题中,很难给出一个比较紧的上界,我们知道 O ( n × 2 n ) O(n \times 2^n) O(n×2n)是一个比较松的上界,即在这份代码中,nn 个位置每次考虑选或者不选,如果符合条件,就加入答案的时间代价。但是实际运行的时候,因为不可能所有的解都满足条件,递归的时候我们还会用 $\textit{target} - \textit{candidates}[\textit{idx}] \ge 0¥ 进行剪枝,所以实际运行情况是远远小于这个上界的。

空间复杂度: O ( target ) O(\textit{target}) O(target)。除答案数组外,空间复杂度取决于递归的栈深度,在最差情况下需要递归 O ( target ) O(\textit{target}) O(target) 层。

加起来和为目标值的组合 题目描述 给出一组候选数C和一个目标数T,找出候选数中起来和等于T的所有组合。 C中的每个数字在一个组合中只能使用一次。 注意: 题目中所有的数字(包括目标数T)都是正整数 组合中的数字 (a_1, a_2, … , a_ka1​,a2​,…,ak​) 要按非递增排序 (a_1 \leq a_2 \leq … \leq a_ka1​≤a2​≤…≤ak​). 结果中不能包含重复的组合 例如:给定的候选数集是[100,10,20,70,60,10,50],目标数是80 解集是: [10,... 阅读详情

相关推荐

Leetcode 39. Combination Sum --数组元素组合,和为目标值,一个元素可用无数次,输出每种组合,每种组合唯一

Given asetof candidate numbers (candidates)(without duplicates)and a target number (target), find all unique combinations incandidateswhere the candidate numbers sums totarget. Thesamerepeat...

Top5软件工程硕士,先后在京东、字节从事多年Java后端开发、实时和离线大数据开发 1735

算法之「组合总和」问题

简介 本篇文章介绍「组合总和」各种变形题的解题思路,争取能够攻克所有组合数问题。 题目 39. 组合总和 40. 组合总和 II 216. 组合总和 III 377. 组合总和 Ⅳ 下面通过例子由浅至深详细讲解。 所有例题均来自leetcode,所示代码均通过所有测试。 解析 39. 组合总和 题目描述 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。

pl0321的博客 3763

【中等】力扣算法题解析LeetCode39:组合总和

本文介绍了一种使用回溯算法解决组合总和问题的方案。给定无重复元素的整数数组和目标值,要求找出所有和为目标的组合(数字可重复使用)。通过排序候选数组并采用深度优先搜索(DFS)进行回溯,结合剪枝优化(当当前数字大于剩余目标值时终止搜索),有效减少了无效路径的遍历。算法通过控制搜索索引避免重复组合,动态维护路径列表并在找到有效解时保存结果。Java实现展示了排序、递归回溯和剪枝的关键步骤,确保了算法的高效性和正确性。

ylumwd的博客 535

04. 组合总和

39. 组合总和

qq_70280303的博客 651

DeepSeek+知网研学:三步搞定文献矩阵与对比分析(实战指南)

本文提供了一套高效实用的文献管理分析实战指南,详细介绍了如何结合DeepSeek大模型与知网研学平台,通过三个核心步骤快速完成文献梳理。该方法能自动提炼文献核心要素、生成结构化对比矩阵,并辅助发现研究空白,显著提升学术研究者的文献分析效率与深度。

weixin_29061509的博客 490

Windows10下RTABMAP+T265实现三维建图

win10+rtabmap+t265扫描地形

Suxiang1997的博客 3486

39. 组合总和【 力扣(LeetCode) 】

本文介绍了LeetCode 39题"组合总和"的解法。题目要求在无重复元素的整数数组中找出所有和为target的不同组合,每个数字可重复使用。解题采用回溯+剪枝算法:先将数组排序以便剪枝优化,然后使用深度优先搜索遍历所有可能组合。当当前元素总和等于目标值时保存结果,并在遍历过程中通过提前终止不满足条件的搜索路径来提高效率。代码实现了这一思路,时间复杂度为O(n^target),空间复杂度为O(target)。该解法能够有效地找出所有符合条件的组合。

yyh520025的博客 994

Abaqus子程序开发避坑指南:从UMESHMOTION到齿轮磨损分析实战

本文深入探讨Abaqus子程序开发中的关键技术与避坑指南,重点解析UMESHMOTION在齿轮磨损分析中的实战应用。从开发环境搭建、调试框架构建到性能优化和大规模计算,提供系统化的解决方案。通过真实案例展示如何避免内存泄漏、网格畸变等常见问题,并介绍数据驱动的磨损预测等前沿技术,帮助工程师提升仿真精度与效率。

weixin_30892037的博客 87

leetcode39组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 target 的不同组合数少于 150 个。示例 1:输入:candidates = [2,3,6,7], target = 7。

weixin_43683432的博客 2227

R语言使用party包中的ctree函数构建条件推理决策树(Conditional inference trees)、使用plot函数可视化训练好的条件推理决策树、条件推理决策树的叶子节点的阴影区域表

R语言使用party包中的ctree函数构建条件推理决策树(Conditional inference trees)、使用plot函数可视化训练好的条件推理决策树、条件推理决策树的叶子节点的阴影区域表示的是阳性样本的比例

data+scenario+science+insight 1223

RFSoC全面解析(八)—— ZCU111 RFSoC评估工具的上位机界面

下面的内容的参考文献为:XILINX公司文档UG1287。 XILINX公司提供了一个RFSoC的ADC/DAC性能的评估工具或者叫评估系统,这个文档就是讲如何使用这个评估工具的。 整个评估系统总的框图如上图所示,评估系统由上位机、ZCU111开发板、子卡以及网线、射频线缆组成。 ZCU111开发板内主要使用的RFSoC外设为时钟驱动和DDR4,RFSoC的PS部分和PL部分都使用了。 PS部分发挥的功能为通过网口与上位机通信,通过IIC总线控制时钟驱动芯片以及数据流控制等;PL部分发挥的功能为

4379

39. 组合总和 - 力扣(LeetCode)

给你一个的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的 所有,并以列表形式返回。你可以按返回这些组合。candidates中的数字可以。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为target的不同组合数少于150个。输入:candidates = [2,3,6,7], target = 7输出:[[2,2,3],[7]]解释:2 和 3 可以形成一组候选,2 + 2 + 3 = 7。

Dubhehug的博客 399

VHDL六层电梯控制器及仿真

六层电梯电梯 设计要求:设计一个六层电梯控制系统要求有超载、关门中断、提前关门清除报警信电梯外人的上升请求信号,电梯外人的下降请求信号, 电梯外人上升请求信号显示电梯外人下降请求信号显示到达楼层信号 设计思路:输入有clk时钟信号(频率为2Hz) full,deng,quick,clr超载、关门中断、提前关门清除报警c_u1,c_u2,c_u3,c_u4,c_u5电梯外人的上升请求c_d2,c_d3,c_d4,c_d5,c_d6 电梯外人的下降请求 d1,d2,d3,d4,d5,d6电梯内人的...

QQ_778132974的博客 1708

[力扣leetcode39]组合总和及回溯法

[力扣leetcode39]组合总和及回溯法回溯yyds小练习 回溯yyds 在算法优化上面回溯法或许没有那么引人注意,但是对于一些题目来说能够回溯已经很好了。 题目:给定一个无重复元素的数组 candidates 和一个目标数 target ,找candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。 比如输入:candidates = [2,3,6,7], target = 7, 所求解集为: [ [7], [2,2,3] ] 对于这道题目最

weixin_50281113的博客 222

SST专题(2-2)MMC-SST 输入级的工作原理及数学模型

本文研究了MMC-SST和iMMC-SST的电路结构及工作原理。系统由前级MMC电路和后级DC/DC电路组成,MMC负责电能转换和能量存储,DC/DC电路进行电压电流调节。重点分析了半桥型子模块(SM)的开关组态和工作原理,建立了平均值模型,推导了上下桥臂电压方程和环流特性。研究表明,通过合理控制子模块充放电模态可维持端口电压平衡,上下桥臂电压调控可影响网侧功率吸收,而环流特性对中压直流侧电压具有重要影响。

嵌入式老牛的博客 768

STM32F4 SPI FLASH(W25Q128)驱动详解(含DMA+完整读写擦除+低功耗)

本文实现了一款基于STM32 HAL库的SPI Flash驱动,以W25Q128为例,提供了完整的初始化、读写、擦除、ID读取等功能。驱动集成了DMA传输、超时保护、页对齐写入等特性,支持扇区擦除、整片擦除、页写入及跨页缓冲写入。代码结构清晰,易于移植到其他SPI Flash型号(如W25Q64、W25Q16等),适用于数据存储、固件升级、文件系统等嵌入式场景。

kevin1499的博客 96

《LeetCode力扣练习》第39题 组合总和 Java

《LeetCode力扣练习》第39题 组合总和 Java 一、资源 题目: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 对于给定的输入,保证和为 target 的不同组合数少于 150 个。 示例

XRT_knives的博客 1075

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Leetcode 39. 组合总和

Leetcode 39. 组合总和1、问题分析2、问题解决3、总结 1、问题分析 题目链接:https://leetcode-cn.com/problems/combination-sum/   本质上就是一个深搜问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。 2、问题解决   笔者以C++方式解决。 #include "iostream" using namespace std; #include "algorithm"

珍惜 8958

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【每日算法】LeetCode 39. 组合总和

摘要:本文从前端视角解析LeetCode 39题"组合总和",探讨回溯算法在组合搜索问题中的应用。通过标准回溯实现(时间复杂度O(N^(T/M)))和动态规划解法对比,强调排序剪枝对效率的提升。结合前端实际场景(如动态表单生成、路由权限组合等),展示算法如何解决"从候选集中找出满足条件的所有组合"这类问题。核心在于回溯算法的"选择-探索-撤销"模式,以及通过控制搜索起始位置避免重复组合的技巧,为前端开发者处理复杂业务逻辑提供算法思路。

LYFlied的博客 969

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

力扣第39题:组合总和(C语言解法)

在一个无重复元素的数组candidates中找到所有和为目标值target的组合。数组中的数字可以多次使用,且组合中的元素按非递减顺序排列。

weixin_48941116的博客 908

力扣第39题 组合总和

记录一下刷题历程 力扣第39题 组合总和。

buaichifanqie的博客 996

LeetCode 力扣 39. 组合总和

题目描述(中等难度) 给几个数字,一个目标值,输出所有和等于目标值的组合。 解法一 回溯法 参考这里) ,就是先向前列举所有情况,得到一个解或者走不通的时候就回溯。和37题有异曲同工之处,也算是回溯法很典型的应用,直接看代码吧。 public List<List<Integer>> combinationSum(int[] nums, int target) { ...

wind_liang的博客 1284

力扣39题:组合总和的 Java 实现

通过本文的介绍,你应该已经了解了如何使用 Java 解决力扣第39题“组合总和”。这个问题是一个很好的练习回溯算法的机会。希望本文能够帮助你更好地理解和掌握回溯算法。如果你有任何问题或需要进一步的帮助,请随时在评论区提问。

2301_77695569的博客 1051

LeetCode第39题_组合总和

给你一个的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有,并以列表形式返回。你可以按返回这些组合。candidates 中的数字可以。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 target 的不同组合数少于 150 个。

qq_40263592的博客 1139

LeetCode39. 组合总和

LeetCode39. 组合总和 方法:回溯法+减枝 回溯法(深度搜索)解的所有可能性; 减枝:保证每个解之间元素不重复; public List<List<Integer>> combinationSum(int[] num,int target) { Arrays.sort(num); //通过排序的方式,减少固定...

qq_41809583的博客 539
上一篇: LeetCode-38 - 外观数列
下一篇: LeetCode-40-组合总和 II
CodAlun
博客等级 码龄8年 46粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值