两个数组的最小乘积和&&说明希尔排序对插入排序的优化

插入排序、冒泡排序、选择排序,希尔排序

以leetcode 上的一道中等题来作为练习

1874. 两个数组的最小乘积和

在写代码之前我们先来分析一下题目

题目描述

给定两个长度相等的数组a和b,它们的乘积和为数组中所有的a[i] * b[i]之和,其中0 <= i < a.length。

比如a = [1,2,3,4],b = [5,2,3,1]时,它们的乘积和为15 + 22 + 33 + 41 = 22
现有两个长度都为n的数组nums1和nums2,你可以以任意顺序排序nums1,请返回它们的最小乘积和。

示例 1:

输入: nums1 = [5,3,4,2], nums2 = [4,2,2,5]
输出: 40
解释: 将 num1 重新排列为 [3,5,4,2] 后,可由 [3,5,4,2] 和 [4,2,2,5] 得到最小乘积和 34 + 52 + 42 + 25 = 40。
示例 2:

输入: nums1 = [2,1,4,5,7], nums2 = [3,2,4,8,6]
输出: 65
解释: 将 num1 重新排列为 [5,7,4,1,2] 后,可由 [5,7,4,1,2] 和 [3,2,4,8,6] 得到最小乘积和 53 + 72 + 44 + 18 + 2*6 = 65。

读完题目之后-思路也是非常清晰

  • 要让两个数组每个位置上的乘积最小,首先肯定是要对数组排序
  • 排好序之后,我们只需要,让一个数组当中的最小值乘以另外一个数组当中的最大值,这样依次相乘,我们就能够保证最后的和最小
  • 废话不多说,我们直接写代码

1·简单插入排序

插入排序思想

  • 将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增加1的有序表
  • 序列的一个元素肯定是有序的,所以在排序比较是我们要从下标为1的开始和已经有序的元素进行比较,直到有序元素为0
  • 在比较的过程中,如果遇到大于已经有序的元素表中第J个元素大于第i个元素那么我们就将第j个位置的元素向后挪动到j+1的位置 nums[j+1]=nums[j];
  • 如果小于等于的时候我们跳出循环
  • 那最后我们把第i个位置的元素,插入到空出来的的位置–也就是j+1的位置–为什么呢,因为最后我们通过j–遍历,j减去了1,所以要加回来

插入排序时间复杂度和空间复杂度分析

插入排序要两个for循环嵌套,所以时间复杂度为o(n^2),空间复杂度为o(1)

插入排序画图分析

插入排序流程

class Solution {
public:
    int minProductSum(vector<int>& nums1, vector<int>& nums2) {
        //插入排序
        //从数组元素中拿一个未排序的数字和已排序的进行比较,找第一个小于其值的位置,放在他的后面,将后面的数字依次向后移动
        for(int i=1;i<nums1.size();i++){
            int temp=nums1[i];
            int j;
            for(j=i-1;j>=0;j--){
                if(nums1[j]>temp){
                    nums1[j+1]=nums1[j];
                }else{
                    break;
                }
            }
            nums1[j+1]=temp;
        }
        for(int i=1;i<nums2.size();i++){
            int temp=nums2[i];
            int j;
            for(j=i-1;j>=0;j--){
                if(nums2[j]>temp){
                    nums2[j+1]=nums2[j];
                }else{
                    break;
                }
            }
            nums2[j+1]=temp;
        }
        long long sum=0;
        for(int i=0,j=nums1.size()-1;j>=0;j--,i++){
            sum+=nums1[i]*nums2[j];
        }
        return sum;
    }
};

依旧超时

希尔排序

算法思想简介

希尔排序又称最小增量排序它也是一种属于插入排序类的方法,在时间效率上对前者有非常大的改进

  • 先将整个待排序记录序列分割成为若干个子序列,分别进行插入排序,待整个序列基本有序时,再对全体记录进行一次排序
  • 希尔排序的时间复杂度大约是(n^1.3)
  • 使用时需注意,增量必须为质数,并且最后一个增量必须为1

画图看下过程吧,还是上面的数字的例子

在这里插入图片描述

我们再来写下代码

  • 首先我们要进行对应的分组–我们需要先写一个分组函数,对原本的序列进行分组,那在这里我们用一个数组来保存我们的增量

int arr[2]{5,3,1}

  • 调用插入排序来进性排序,那插入排序我们需要修改一下,之前是在已经排好序当中我们去比较调换,先我们要一组,一组的进行比较调换,那我们怎么办呢?

在这写代码的时候有可能会陷入一个误区那就是我们一个组一个组的比较,这样是比较麻烦的,那在正确的做法是这样的

  • 第一组的第2个值,第二组的第2个值
  • 第一组的第3个值,第三组的第3个值

代码

class Solution {
public:
    vector<int> Shell(vector<int>&arr,int gap){
        for(int i=gap;i<arr.size();i++){
            int temp=arr[i];
            int j;
            for(j=i-gap;j>=0;j=j-gap){
                if(arr[j]>temp){
                    arr[j+gap]=arr[j];
                }else{
                    break;
                }
            }
            arr[j+gap]=temp;
        }
        return arr;
    }
public:
    vector<int> Shell_Sort(vector<int> &arr){
        int gap[]={5,3,1};
        for(int i=0;i<sizeof(gap)/sizeof(gap[0]);i++){
            Shell(arr, gap[i]);
        }
        return arr;
    }
public:
    int minProductSum(vector<int>& nums1, vector<int>& nums2) {
        Shell_Sort(nums1);
        Shell_Sort(nums2);
        long long sum=0;
        for(int i=0,j=nums1.size()-1;j>=0;j--,i++){
            sum+=nums1[i]*nums2[j];
        }
        return sum;
    }
};
 int gap[]{7,5,3,1};

当我们这里是7,5,3,1的时候,我们通不过,超时
在这里插入图片描述
但当我们改一行代码,我们就可以看到实实在在的改变,当我们将gap设置成500以内的质数的时候,我们发现时间就通过了

int gap[]{499,491,487,479,467,463,461,457,449,443,439
,433,431,421,419,409,401,397,389,383,379,373,367,359,353,349,347,337,331,317,313,311,307,293,283,281,277,271,269,263,257
,251,241,239,233,229,227,223,211,199,197,193,191,181,179,173,167,163,157,151,149,139,137,131,127,113,109,107,103,101,97,
89,83,79,73,71,67,61,59,53,47,43,41,37,31,29,23,19,17,13,11,7,5,3,1};

在这里插入图片描述

2·使用系统的快速排序

  • 首先我们使用快速排序先来做一次,第一次孩子为了通过,使用了系统的的快速排序,我们先来看下最终通过的时间😊

代码

class Solution {
public:
    int minProductSum(vector<int>& nums1, vector<int>& nums2) {
        //词题直接排序,从小到大,然后依次相乘,再相加
        sort(nums1.begin(),nums1.end());
        sort(nums2.begin(),nums2.end());
        reverse(nums2.begin(),nums2.end());
        int sum=0;
        for(int i=0;i<nums1.size();i++)
        {
            sum+=nums1[i]*nums2[i];
        }
        return sum;
    }
};

通过时间

在这里插入图片描述

3·冒泡排序

首先介绍一下冒泡排序的算法思想

  1. 比较相邻位置的元素,如果第一个比第二个大,就交换他们两个的值
  2. 对每一对相邻元素做同样的事情,从开始第一对到最后一对,那在这里有一个要注意的点就是,因为你是成对出现的,比较的是相邻的,所以遍历的时候,最后一个值是不能作为起始值,不然会造成数组越界,同时对已经排好序的就不用再排了,所以在这里循环结束的条件是 j<length-i-1;
  3. 持续上述的操作,直到没有要比较的数字
  4. 冒泡排序时间复杂度为o(n^2)因为双重for循环,空间复杂度为o(1),不需要额外空间

代码-直接超时

class Solution {
public:
    int minProductSum(vector<int>& nums1, vector<int>& nums2) {
        int sum=0;
        int len1=nums1.size(),len2=nums2.size();
        //先来将第一个数组有小到达排序
        for(int i=0;i<len1;i++){
            for(int j=0;j<len1-i-1;j++){
                if(nums1[j]>nums1[j+1]){
                    int temp=nums1[j];
                    nums1[j]=nums1[j+1];
                    nums1[j+1]=temp;
                }
            }
        }
        //将第二个数组从大到小排序
        for(int i=0;i<len2;i++){
            for(int j=0;j<len2-i-1;j++){
                if(nums2[j]<nums2[j+1]){
                    int temp=nums2[j];
                    nums2[j]=nums2[j+1];
                    nums2[j+1]=temp;
                }
            }
        }
        //排好序之后,直接便利求最小和
        for(int i=0;i<len1;i++){
            sum+=nums1[i]*nums2[i];
        }
        return sum;
    }
};

超时

在这里插入图片描述

4·选择排序-我来了

先理解算法思想

  1. 首先在排序中找到最小元素,放到序列的起始位置
  2. 再从剩余的部分继续找
  3. 重复2的步骤直到结束
    时间复杂度一依旧是o(N^2),估计过不了,不过没关系,我们自己写着练习嘛

代码-依旧超时

class Solution {
public:
    int minProductSum(vector<int>& nums1, vector<int>& nums2) {
        int sum=0;
        int len1=nums1.size(),len2=nums2.size();
        //先来将第一个数组由小到达排序
        for(int i=0;i<len1;i++){
            for(int j=i;j<len1;j++){
                if(nums1[i]>nums1[j]){
                    int temp=nums1[j];
                    nums1[j]=nums1[i];
                    nums1[i]=temp;
                }
            }
        }
        //将第二个数组从大到小排序
        for(int i=0;i<len2;i++){
            for(int j=i;j<len2;j++){
                if(nums2[i]<nums2[j]){
                    int temp=nums2[j];
                    nums2[j]=nums2[i];
                    nums2[i]=temp;
                }
            }
        }
        //排好序之后,直接便利求最小和
        for(int i=0;i<len1;i++){
            sum+=nums1[i]*nums2[i];
        }
        return sum;
    }
};

超时

#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
    /**
     * 冒泡排序-时间复杂度位 o(n^2)-空间复杂度位o(1)
     * 1·比较相邻元素,如果第一个比第二个大,就交换他们两个
     * 2·对每一对相邻元素做同样的工作,从开始第一个对到结尾最后一对。做完这些元素之后,最后的元素就是最大的值,针对所有的元素重复以上步骤,除了最后一个
     * 3·持续每次对上面元素执行操作,直到没有比较的数字
     * @param nums
     * @return
     */
    static vector<int> Bubbling_sort(vector<int>&nums){
        for(int i=0;i<nums.size();i++){
            //在这里有一个注意的点,j<lne-i之后要减去一个1,因为后面写的是j+1会造成数组越界
            for(int j=0;j<nums.size()-i-1;j++){
                if(nums[j]>nums[j+1]){
                    int temp=nums[j];
                    nums[j]=nums[j+1];
                    nums[j+1]=temp;

                }
            }
        }
        return nums;
    }

    /**
     * 选择排序-时间复杂度为o(n^2)-空间复杂度为o(1)
     * 1·首先在排序中找到最小元素,方到序列起始位置
     * 2·再从剩余的部分继续找
     * 3·重复第2步直到结束
     * @param nums
     * @return
     */
    static vector<int> Selection_sort(vector<int>&nums) {
        for(int i=0;i<nums.size();i++){
            for(int j=i+1;j<nums.size();j++){
                if(nums[j]<nums[i]){
                    int temp=nums[i];
                    nums[i]=nums[j];
                    nums[j]=temp;
                }
            }
        }
        return nums;
    }
    /**
     *插入排序-插入排序的时间复杂度为o(n^2)
     * 1·将待排序序列的第一个元素看做一个有序序列,把第二个元素到最后一个元素当成为排序序列
     * 2·从头到尾依次扫描未排序的序列,将扫描大到的每个元素插入有序序列的适当位置,如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面
     * @param nums
     * @return
     */
    static vector<int> Insertion_sort(vector<int>&nums){
        for(int i=1;i<nums.size();i++){
            //前面已经有序的元素
            int orderly=i-1;
            //定义一个变量记录当前元素得值
            int current=nums[i];
            //用来判断是否需要排序
            while(orderly>=0&&current<nums[orderly]){
                //如果需要交换则将前面得元素依次向后移动
                    nums[orderly+1]=nums[orderly];
                        orderly--;

            }
            //将要移动位置赋值为 记录得要交换得值
            nums[orderly+1]=current;
        }
        return nums;
    };
    //打印排序结果
    static void Print_sort(vector<int>&nums){
        for (int num: nums)cout << num << " ";
        cout<<endl;
        cout<<"_____________________"<<endl;
    }
};
int main() {
    int n;
    cin>>n;
    vector<int>arr;
    //输入测试数据
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        arr.push_back(x);
    }

   /* cout<<"冒泡排序"<<endl;
    Solution::Bubbling_sort(arr);
    Solution::Print_sort(arr);
    cout<<"选择排序"<<endl;
    Solution::Selection_sort(arr);
    Solution::Print_sort(arr);*/

    cout<<"插入排序"<<endl;
    Solution::Insertion_sort(arr);
    Solution::Print_sort(arr);
    return 0;
}

在这里插入图片描述

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
本文件中讲述了c语言经典的282个案例,由浅入深。有利于提高广大爱好c语言编程的人员。 其中包括: 第1章 初识C语言 1 实例001 第一个C语言程序 2 实例002 一个完整的C语言程序 2 实例003 输出名言 3 实例004 用TC 2.0打开文件 4 实例005 计算正方形的周长 5 第2章 简单的C程序 6 实例006 输出一个正方形 7 实例007 输出一个三角形 8 实例008 一个简单的求和程序 9 实例009 求10! 10 实例010 3个数由小到大排序 11 实例011 猴子吃桃 13 实例012 阳阳买苹果 14 第3章 算法入门 15 实例013 任意次方后的最后三位 16 实例014 计算某日是该年的第几天 16 实例015 婚礼上的谎言 18 实例016 百元买百鸡 19 实例017 打渔晒网问题 20 实例018 判断三角形的类型 22 实例019 直接插入排序 23 实例020 希尔排序 25 实例021 冒泡排序 26 实例022 快速排序 27 实例023 选择排序 28 实例024 归并排序 29 实例025 二分查找 31 实例026 分块查找 32 实例027 哈希查找 34 实例028 斐波那契数列 37 实例029 哥德巴赫猜想 38 实例030 尼科彻斯定理 39 第4章 常用数据类型 41 实例031 数值型常量的使用 42 实例032 字符型变量的使用 42 实例033 求100~200之间的素数 43 实例034 利用#输出三角形 44 实例035 十进制转换为二进制 45 实例036 n进制转换为十进制 46 实例037 小球下落问题 48 实例038 巧分苹果 49 实例039 老师分糖果 50 实例040 IP地址形式输出 51 实例041 特殊的完全平方数 52 实例042 一数三平方 54 实例043 求等差数列 55 实例044 亲密数 56 实例045 自守数 57 第5章 运算符与表达式 60 实例046 求二元一次不定方程 61 实例047 可逆素数 63 实例048 判断闰年 64 实例049 黑纸与白纸 65 实例050 阿姆斯特朗数 67 实例051 最大公约数和最小公倍数 67 实例052 求一元二次方程的根 69 实例053 自然对数的底e的计算 70 实例054 满足abcd=(ab+cd)2的数 70 实例055 整数加减法练习 71 实例056 判断整倍数 73 实例057 阶梯问题 73 实例058 乘积大于和的数 74 实例059 求各位数之和为5的数 75 第6章 数据输入与输出函数 77 实例060 使用字符函数输入/输出字符 78 实例061 输出相对的最小整数 79 实例062 将小写字母转换为大写字母 80 实例063 水池注水问题 80 实例064 用*号输出图案 81 实例065 输出一个字符的前驱字符 82 实例066 求学生总成绩和平均成绩 83 实例067 回文素数 84 第7章 选择和分支结构程序设计 86 实例068 判断偶数 87 实例069 判断字母是否为大写 88 实例070 检查字符类型 89 实例071 求最低分和最高分 90 实例072 模拟自动售货机 91 实例073 计算工资 93 实例074 平方和值判断 94 实例075 加油站加油 95 实例076 简单计算器 97 第8章 循环结构 98 实例077 使用while语句求n! 99 实例078 使用while为用户提供 菜单显示 100 实例079 一元钱的兑换方案 102 实例080 特殊等式 103 实例081 打印乘法口诀表 104 实例082 平方和运算的问题 105 实例083 求从键盘中输入字符的个数 106 实例084 打印杨辉三角 108 实例085 求总数问题 109 实例086 彩球问题 110 实例087 新同学年龄 112 实例088 灯塔数量 113 实例089 计算12+22+…+102 114 实例090 循环显示随机数 115 实例091 卖西瓜 116 实例092 银行存款问题 117 实例093 统计不及格的人数 118 实例094 猜数字游戏 119 第9章 数组 123 实例095 求各元素之和 124 实例096 使用二维数组保存数据 125 实例097 计算字符串中有多少个单词 126 实例098 不使用strcpy()函数实现 字符串复制功能 127 实例099 逆序存放数据 129 实例100 相邻元素之和 130 实例101 选票统计 131 实例102 使用数组统计学生成绩 132 实例103 查找数组中的最值 134 实例104 判断一个数是否存在数组中 135 实例105 求二维数组对角线之和 136 实例106 模拟比赛打分 137 实例107 矩阵的转置 139 实例108 设计魔方阵 141 实例109 字符升序排列 142 实例110 在指定位置插入字符 144 实例111 删除字符串中的连续字符 146 实例112 统计各种字符个数 147 实例113 字符串替换 148 实例114 回文字符串 150 实例115 字符串加密和解密 151 实例116 对调最大数与最小数位置 153 第10章 函数编程基础 155 实例117 输出两个数中的最大值 156 实例118 判断素数 157 实例119 递归解决年龄问题 158 实例120 递归解决分鱼问题 159 实例121 小数分离 160 实例122 求任意数的n次幂 161 实例123 固定格式输出当前时间 163 实例124 设计函数计算学生平均身高 164 实例125 求数组元素中的最小值 165 实例126 打印1~5的阶乘 166 实例127 求最大公约数和最小公倍数 167 实例128 求直角三角形的斜边 168 实例129 相对的最小整数 169 实例130 当前时间转换 170 实例131 显示程序运行时间 171 实例132 显示当前日期及时间 172 实例133 设置DOS系统日期 173 实例134 设置DOS系统时间 174 实例135 读取并设置BIOS的时钟 175 实例136 任意大写字母转小写 176 实例137 字符串复制到指定空间 176 实例138 查找位置信息 177 实例139 复制当前目录 179 实例140 产生唯一文件 180 实例141 不同亮度显示 181 实例142 字母检测 182 实例143 建立目录 183 实例144 删除目录 184 实例145 对数组进行升序和降序排序 185 实例146 设置组合键 187 实例147 获取当前日期与时间 188 实例148 获取当地日期与时间 189 实例149 获取格林尼治平时 190 实例150 设置系统日期 191 实例151 获取BIOS常规内存容量 193 实例152 读/写BIOS计时器 194 实例153 获取CMOS密码 195 实例154 获取Ctrl+Break消息 197 实例155 鼠标中断 198 实例156 设置文本显示模式 200 实例157 显卡类型测试 204 实例158 获取系统配置信息 206 实例159 访问系统temp中的文件 209 实例160 控制扬声器声音 210 实例161 获取Caps Lock键状态 211 实例162 获取环境变量 212 实例163 贪吃蛇游戏 213 实例164 五子棋游戏 219 实例165 弹力球游戏 227 第11章 指针 235 实例166 使用指针实现整数排序 236 实例167 指向结构体变量的指针 237 实例168 使用指针输出数组元素 238 实例169 使用指针查找数列中的 最大值和最小值 240 实例170 使用指针的指针输出字符串 241 实例171 使用指向指针的指针对 字符串排序 242 实例172 使用返回指针的函数查找 最大值 244 实例173 使用指针连接两个字符串 245 实例174 用指针实现逆序存放数 组元素值 247 实例175 用指针数组构造字符串数组 248 实例176 用指针函数输出学生成绩 249 实例177 寻找相同元素的指针 251 实例178 查找成绩不及格的学生 252 实例179 使用指针实现冒泡排序 254 实例180 输入月份号并输出英文月份名 255 实例181 使用指针插入元素 256 实例182 使用指针交换两个数组 中的最大值 257 实例183 输出二维数组有关值 259 实例184 输出二维数组任一行 任一列值 260 实例185 将若干字符串按照字母 顺序输出 262 实例186 用指向函数的指针比较大小 263 实例187 寻找指定元素的指针 265 实例188 字符串的匹配 266 第12章 常用数据结构 269 实例189 比较计数 270 实例190 找出最高分 271 实例191 信息查询 272 实例192 候选人选票程序 274 实例193 计算开机时间 276 实例194 取出整型数据的高字节数据 277 实例195 使用共用体存放学生和 老师信息 278 实例196 使用共用体处理任意类型数据 279 实例197 输出今天星期几 281 实例198 创建单向链表 282 实例199 创建双向链表 284 实例200 创建循环链表 287 实例201 使用头插入法建立单链表 289 实例202 双链表逆序输出 291 实例203 约瑟夫环 293 实例204 创建顺序表并插入元素 294 实例205 合并两个链表 296 实例206 单链表节点逆置 298 实例207 应用栈实现进制转换 300 实例208 用栈实现行编辑程序 303 实例209 用栈设置密码 306 实例210 括号匹配检测 310 实例211 用栈及递归计算多项式 313 实例212 链队列 315 实例213 循环缓冲区问题 318 实例214 简单的文本编辑器 321 第13章 位运算操作符 326 实例215 使二进制数特定位翻转 327 实例216 将输入的数左移两位并输出 327 实例217 编写循环移位函数 328 实例218 取出给定16位二进制数 的奇数位 330 实例219 取一个整数的后四位 331 实例220 求一个数的补码 332 实例221 普通的位运算 333 实例222 整数与0异或 334 第14章 存储管理 335 实例223 使用malloc()函数分配内存 336 实例224 调用calloc()函数动态分 配内存 337 实例225 为具有3个数组元素的 数组分配内存 338 实例226 为二维数组动态分配内存 338 实例227 商品信息的动态存放 340 第15章 预处理和函数类型 341 实例228 用不带参数的宏定义求 平行四边形面积 342 实例229 使用宏定义实现数组值 的互换 343 实例230 编写头文件包含圆面积的 计算公式 344 实例231 利用宏定义求偶数和 345 实例232 利用文件包含设计输出模式 346 实例233 使用条件编译隐藏密码 347 第16章 文件读写 349 实例234 关闭所有打开的文件 350 实例235 同时显示两个文件的内容 352 实例236 创建文件 353 实例237 格式化读写文件 355 实例238 创建临时文件 357 实例239 成块读写操作 358 实例240 随机读写文件 360 实例241 以行为单位读写文件 362 实例242 查找文件 364 实例243 重命名文件 364 实例244 删除文件 366 实例245 删除文件中的记录 367 实例246 文件内容复制 369 实例247 错误处理 370 实例248 合并两个文件信息 373 实例249 统计文件内容 375 实例250 读取磁盘文件 376 实例251 将数据写入磁盘文件 378 实例252 显示目录内同类型文件 379 实例253 文件分割 382 实例254 文件加密 384 实例255 自毁程序 386 实例256 明码序列号保护 388 实例257 非明码序列号保护 389 实例258 恺撒加密 391 实例259 RSA加密 394 实例260 获取当前磁盘空间信息 396 实例261 DES加密 398 实例262 获取系统配置信息 403 实例263 获取寄存器信息 405 第17章 图形图像处理 407 实例264 绘制直线 408 实例265 绘制矩形 409 实例266 绘制表格 411 实例267 绘制立体窗口 412 实例268 绘制椭圆 414 实例269 绘制圆弧线 415 实例270 绘制扇区 417 实例271 绘制空心圆 418 实例272 绘制箭头 419 实例273 绘制正弦曲线 420 实例274 绘制彩带 421 实例275 绘制黄色网格填充的椭圆 423 实例276 绘制红色间隔点填充的 多边形 424 实例277 绘制五角星 425 实例278 颜色变换 427 实例279 彩色扇形 428 实例280 输出不同字体 429 实例281 相同图案的输出 431 实例282 设置文本及背景颜色 433

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HANWEN KE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值