代码随想录算法训练营day29 | 贪心算法 | 134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列

news2024/9/21 20:42:23

文章目录

    • 134.加油站
      • 思路
      • 小结
    • 135.分发糖果
      • 思路
      • 拓展——环形分糖
      • 小结
    • 860.柠檬水找零
      • 思路
    • 406.根据身高重建队列
      • 思路
      • 小结

今天是贪心算法专题第三天,直接上题目

134.加油站

建议:本题有点难度,不太好想,推荐大家熟悉一下方法二

题目链接:134. 加油站 - 力扣(LeetCode)

思路

这是我学校算法设计与分析课程的期末题,这道题目比较难

暴力解法不能通过最后一个测试,这里我们只研究贪心解法

  1. 如果总油量减去总消耗大于等于0,即各个站点的加油站 剩油量rest[i]≥0,那么一定可以跑完这一圈
  2. 如果当前站点的rest[i] < 0,那么这个站点一定不是start,则选择下一个站点作为起始位置,继续判断
  3. 将连续的多个站点等效地看成一个站点,如果其累积剩油量 < 0,则跳过,选择下一个站点作为起始位置,继续判断

对第3条的解释

设start为当前的起始位置,i从start开始累加rest[i](start初始为0),和记为curSum,一旦curSum < 0,说明[start, i]区间都不能作为起始位置,因为在这个区间中选择任意一个位置作为起点,到站点i都会断油,那么起始位置就应该从i + 1算起,再从0计算curSum,即start = i + 1; curSum = 0;

如图所示:

img

  • 证明:若[start, i]区间和为负数,则[start, i]区间内的任意一点都不能作为起始位置,否则从该点到站点i,curSum都小于0

    取区间内一点a,将[start, i]分为两个子区间——区间1 和 区间2,如果curSum < 0,说明 区间1的和 + 区间2的和 < 0,假设从点a开始计数curSum不小于0,即区间2的和 ≥ 0

    区间1的和 + 区间2的和 < 0,而区间2的和 ≥ 0,只能有区间1的和 < 0,即[start, a]的区间和 curSum < 0。[start, i-1]区间和始终为正数(我们在每个站点处都检测curSum是否大于0,只有某个站点的curSum < 0时,我们才更新start,因此[start, i-1]区间和始终为正数),与[start, a]的区间和 curSum < 0矛盾,故 点a不能作为起始位置

那么局部最优:当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行。全局最优:找到可以跑一圈的起始位置

这里的“局部最优”是对于当前区间[start, i]而言的,如果[start, i]的curSum < 0,则起始位置至少为i + 1,“全局最优”可以看为对于整个区间[0, N]而言的,如果[0, N]的totalSum < 0,则不能跑完一整圈。最终我们找到的起始位置start有这样的性质:[0, start]的curSum1 < 0,[start, N]的curSum2 > 0。由于totalSum > 0,因此curSum2 + curSum1 > 0,即[start, N]的剩余油量 足够 [0, start]的消耗量,从start能够跑完一整圈

代码如下

// 贪心解法
class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int curSum = 0;
        int totalSum = 0;
        int start = 0;
        for(int i=0; i<gas.size(); ++i)
        {
            curSum += gas[i] - cost[i];
            totalSum += gas[i] - cost[i];
            if(curSum < 0)
            {
                start = i + 1;  // 当前累加的rest[i]和 curSum小于0,则说明[0, i]之间不会出现起始点,因此更新start为 i + 1
                curSum = 0;		// 重新开始计数
            }
        }
        if(totalSum < 0) return -1;
        return start;
    }
};

Q:start = i + 1,会不会有这样的情况:当 i 为 gas.size() - 1 时,curSum < 0,导致start 为 gas.size(),出现错误?

A:不会,如果[start, N]的curSum < 0,又有[0, start]的curSum < 0,则totalSum < 0,此时返回-1,而不返回start,不会造成错误

小结

这是一道比较难的题目,关键是要想到如果整个区间的totalSum < 0,则不会走完一整圈(全局),由此可以想到 对于部分区间[start, i]的curSum,如果curSum < 0,则区间[start, i]中的任意一点都不可能为起始位置,起始位置至少是 i + 1,否则 从区间内任意一个点 到 站点i,都有curSum < 0(局部),这里体现了贪心的”局部最优“ 和 ”全局最优”

也可以这么想:对于一个站点i,如果它的rest[i] < 0,则站点i不能作为起始位置。接下来将连续的站点视为一个站点,将这些站点的累积剩余量 视为 这一个站点的rest[i],如果这些站点的累积剩余量 < 0,则相当于 这一个站点的rest[i] < 0,那么这些站点都不能作为起始位置

135.分发糖果

建议:本题涉及到一个思想,就是想处理好一边再处理另一边,不要两边想着一起兼顾,后面还会有题目用到这个思路

题目链接:135. 分发糖果 - 力扣(LeetCode)

思路

这种需要考虑两边(既要和左孩子比较,又要和右孩子比较)的题目,需要先确定一边(只与左孩子比较),再确定另一边(只与右孩子比较),两边同时考虑会很乱,我们以ratings为[1,2,2,5,4,3,2]为例,初始时,candyVec每个元素都初始化为1,满足每个孩子都至少有一个糖果

  1. 首先考虑 当前孩子 与 左孩子比较,我们关注 当前孩子评分 大于 左孩子的情况

    从前向后遍历,只要当前孩子评分比其左孩子大,当前孩子就比左孩子多得一个糖果(局部最优),这样,相邻的孩子中,所有比左孩子评分高的孩子都能获得 比左孩子更多的糖果(全局最优),代码如下:

    for(int i=1; i<rating.size(); ++i)
    {
        if(ratings[i] > ratings[i-1])
        {
            candyVec[i] = candyVec[i-1] + 1;
        }
    }
    

    举例说明:

    • ratings : [1,2,2,5,4,3,2]
    • candyVec : [1,2,1,2,1,1,1]
  2. 然后考虑 当前孩子 与 右孩子比较,我们关注 当前孩子评分 大于 右孩子的情况

    从后向前遍历,只要当前孩子评分比其右孩子大,当前孩子的糖果数candyVec[i] 就至少为 右孩子糖果数+1,即candyVec[i+1] + 1

    如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较 当前孩子与左孩子得到的糖果数量)

    注意,还要同时满足当前孩子 与 左孩子比较的情况。对于第一次遍历后的数组candyVec,它实现了:若当前孩子评分 比其左孩子大,则当前孩子的糖果数candyVec[i] 至少为 candyVec[i-1]+1。我们要同时满足当前孩子 与 左右孩子比较的情况,就要让candyVec[i]取到candyVec[i+1] + 1 和 candyVec[i] 中最大的值,candyVec[i]只有取最大的才能既保持对左边candyVec[i - 1]的糖果多,也比右边candyVec[i + 1]的糖果多

    这里使用的贪心:

    • 局部最优:取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,保证第i个小孩的糖果数量既大于左边的也大于右边的
    • 全局最优:相邻的孩子中,评分高的孩子获得更多的糖果。

    代码如下:

    // 从后向前
    for (int i = ratings.size() - 2; i >= 0; i--) {
        if (ratings[i] > ratings[i + 1] ) {
            candyVec[i] = max(candyVec[i], candyVec[i + 1] + 1);
        }
    }
    

    举例说明:

    • ratings : [1,2,2,5,4,3,2]
    • candyVec : [1,2,1,2,1,1,1] (第一次遍历,与左孩子比较后的结果)
    • candyVec : [1,2,1,4,3,2,1] (第二次遍历,与右孩子比较后的结果)

Q:为什么在比较 当前孩子评分 与 右孩子时,要从后向前遍历?从前向后遍历呢?

A:这是为了每次与右孩子比较时,能利用上最新的比较结果,比如rating[5]与rating[4]的比较 需要利用上 rating[5]与rating[6]的比较结果;如果从前向后遍历,rating[5]与rating[4]的比较 就不能用上 rating[5]与rating[6]的比较结果了

举例说明:

  • ratings : [1,2,2,5,4,3,2]
  • candyVec : [1,2,1,2,1,1,1] (第一次遍历,与左孩子比较后的结果)

如果从前向后遍历,则比较rating[3] 与 rating[4]后,candyVec : [1,2,1,2,1,1,1]( candyVec[3] = max(candyVec[3], candyVec[4]+1) )

接下来比较rating[4] 与 rating[5],candyVec : [1,2,1,2,2,1,1]

然后 比较rating[5] 与 rating[6],candyVec : [1,2,1,2,2,2,1]

最后 比较rating[5] 与 rating[6],candyVec : [1,2,1,2,2,2,2]

发现最后的结果是错误的,这是因为rating[i] 与 rating[i+1]比较后,将rating[i] 更新为 max(rating[i], rating[i+1] + 1),而rating[i+1]在后续的比较中又被修改了,rating[i]是基于旧值修改的,而不是rating[i+1]被修改后的新值,因此出错

代码实现

class Solution {
public:
    int candy(vector<int>& ratings) {
        vector<int> candyVec(ratings.size(), 1);    // 初始化所有元素为1,保证每个孩子至少有一个糖
        // 首先比较当前孩子与左孩子
        for(int i=1; i<ratings.size(); ++i)
        {
            if(ratings[i] > ratings[i-1])
            {
                candyVec[i] = candyVec[i-1] + 1;    // 如果当前孩子 > 左孩子,则当前孩子糖果数 = 左孩子糖果数 + 1
            }
        }
        // 接下来比较当前孩子与右孩子
        for(int i=ratings.size()-2; i >= 0; --i)
        {
            if(ratings[i] > ratings[i+1])
            {
                candyVec[i] = max(candyVec[i], candyVec[i+1] + 1);  // 如果当前孩子 > 右孩子,则让candyVec[i]取到candyVec[i+1] + 1 和 candyVec[i] 中最大的值
            }
        }
        int result = 0;
        for(int num : candyVec)
        {
            result += num;
        }
        return result;
    }
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

拓展——环形分糖

如果小朋友围成了一个环,其它条件不变,该怎么做?

只在数组前后分别添加末尾元素 和 首元素,再进行两次遍历,这样可以吗?

不可以,以4,2,3为例,可能出现这样的情况:当前孩子与左孩子比较时:

  • rating : [3,4,2,3,4]
  • candyVec : [1,2,1,2,2]

可以发现

末尾元素3的candyVec修改为2,而ratin[0]对应的candyVec[0]为2,这就犯了上面解释过的错误:用旧值修改candyVec[i],而没有用新值,所以添加首尾元素后,只用两次遍历是不可以的

用两种思路:

  • 将rating数组复制三份后拼接起来,用两次遍历(从前向后 和 从后向前),取中间部分的candyVec,即为最后结果

  • 在原rating数组上操作,但是遍历次数要增多,每轮循环都分别进行两次遍历,若首尾元素的candyVec有变化,就要更新candyVec[0] 和 candyVec[N], candyVec[0] = candyVec[N-1];candyVec[N] = candyVec[1],继续遍历,直至首尾元素的candyVec都没有变化,循环结束

    以[4,2,3]为例,在数组前后增加末尾 和 起始元素:[3,4,2,3,4]

    1. 第一次循环:

      • rating: [3,4,2,3,4]
      • candyVec: [1,2,1,2,3](与左孩子比较)
      • candyVec: [1,2,1,2,3] (与右孩子比较)

      可以看到,首尾元素的candyVec发生了变化,需要更新candyVec[0]和candyVec[N]

    2. 第二次循环:

      • rating: [3,4,2,3,4]
      • candyVec: [2,2,1,2,2](更新后)
      • candyVec: [2,3,1,2,3](与左孩子比较)
      • candyVec: [2,3,1,2,3] (与右孩子比较)

      首元素的candyVec发生了变化,需要继续循环

    3. 第三次循环:

      • rating: [3,4,2,3,4]
      • candyVec: [2,3,1,2,3](更新后)
      • candyVec: [2,3,1,2,3](与左孩子比较)
      • candyVec: [2,3,1,2,3] (与右孩子比较)

      首尾元素的candyVec都没有变化,结束循环

    最终结果为[3,1,2]

小结

这是一道比较困难的题目,关键是理解这个思想:对于要处理两边的问题,应该先处理好一边,然后再处理另一边,两边同时考虑会很乱

环形分糖问题需要考虑如何处理环形结构,这也是一道面试题目,如果要在原数组上操作,就要循环多次,更新开头的candyVec[0] 和 末尾的candyVec[N],避免出现 用candyVec[0] 或 candyVec[N]的旧值 修改 candyVec[i] 的情况

860.柠檬水找零

建议:本题看上好像挺难,其实很简单,大家先尝试自己做一做

题目链接:860. 柠檬水找零 - 力扣(LeetCode)

思路

只有三种情况:

  • 支付5美元,直接收下,增加一张5美元
  • 支付10美元,则消耗一张5美元,增加一张10美元
  • 支付20美元,则有两种组合:
    • 消耗一张10美元+一张5美元
    • 消耗三张5美元

前两种情况都是固定策略,只有第三种情况有两种组合策略,这需要我们判断哪种组合策略是优先的,在代码中就是if 和 else if的条件的顺序问题

这里用到了贪心的策略:我们尽可能使用大面额进行找零,保留小面额纸币,10美元只能给账单20找零,而5美元可以给10美元和20美元找零,5美元应用的更广

所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零

代码如下

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int five = 0, ten = 0, twenty = 0;
        for (int bill : bills) {
            // 情况一
            if (bill == 5) five++;
            // 情况二
            if (bill == 10) {
                if (five <= 0) return false;
                ten++;
                five--;
            }
            // 情况三
            if (bill == 20) {
                // 优先消耗10美元,因为5美元的找零用处更大,能多留着就多留着
                if (five > 0 && ten > 0) {
                    five--;
                    ten--;
                    twenty++; // 其实这行代码可以删了,因为记录20已经没有意义了,不会用20来找零
                } else if (five >= 3) {
                    five -= 3;
                    twenty++; // 同理,这行代码也可以删了
                } else return false;
            }
        }
        return true;
    }
};

这道题目可以告诉大家,遇到感觉没有思路的题目,可以静下心来把能遇到的情况分析一下,只要分析到具体情况了,一下子就豁然开朗了。如果一直陷入想从整体上寻找找零方案,就会把自己陷进去,各种情况一交叉,只会越想越复杂了——Carl

406.根据身高重建队列

建议:本题有点难度,和分发糖果类似,不要两头兼顾,处理好一边再处理另一边

题目链接:406. 根据身高重建队列 - 力扣(LeetCode)

思路

这道题的第一个难点在于看懂题目,你可以将这个问题想象为体育课排队问题,第一节课老师让同学们记住队伍前面有几个比自己高的,这就是题目给的people数组,但它是无序的,people[i] 并不对应队列中第i个人的h和k。在上第二节课的时候,我们需要用people数组还原正确的队列que,que[i]对应队列中第i个人的h和k

第二个难点在于如何利用people恢复队列。这道题与 135.分发糖果 类似,如果要同时处理两个维度,要先确定一个维度,再确定另一个维度,这道题目中有两个维度:h和k,关键在于先处理哪个维度

  • 如果按照k来从小到大排序,排完之后,会发现k的排列并不符合条件,身高也不符合条件,两个维度哪一个都没确定下来
  • 那么按照身高h来排序呢,身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。此时我们可以确定一个维度了,就是身高,此时people按照身高降序排列

因此我们先按照身高h降序排列people

Q:为什么要按照降序排列身高呢?

A只有先让身高高的先进入队伍,后面身高低的才能根据前面高的来找自己的位置,接下来举例说明:

引用6qishi的评论

按照身高降序排列后,people数组:

[[7,0],[7,1],[6,1],[5,0],[5,2],[4,4]]

每次让最高的学生出来找自己的位置,第一个高个子[7,0]自然站到了第一个位置:

[[7,0]]

而第二个高个子[7,1]知道有一个人大于等于自己的身高,站在了第一个人身后:

[[7,0],[7,1]]

第三个人[6,1]想了想,有一个人比自己高,那自己肯定站在第二位,于是就插队,现在也站到了第一个人身后:

[[7,0],[6,1],[7,1]]

第四个人[5,0]想了想,没人比自己高,那自己肯定站在第一位,于是就插队,站到了队头:

[[5,0],[7,0],[6,1],[7,1]]

第五个人[5,2]想了想,有两个人比自己高,于是就插队,站到了第二个人后面,也就是第三个位置:

[[5,0],[7,0],[5,2],[6,1],[7,1]]

第六个人[4,4]看了看眼前的队伍,比自己高的人都在里面,他安心的数着前面有四个人比自己高,心安理得的站到了第四个人身后:

[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]

接下来处理维度k身高低的人是不会对身高高的人的排序造成影响的,所以先把身高高的人排序好了以后,无论低身高的人怎么排都不会造成身高高的人的位置错误,所以只要每次把身高高的人先排序好,其相对位置就固定了,再将低身高的人插入就是正确的排列。因此,按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列

以[5,2]为例:

406.根据身高重建队列

所以在按照身高从大到小排序后:

局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性

全局最优:最后都做完插入操作,整个队列满足题目队列属性

代码实现

用链表插入效率高,因此使用链表作为que

class Solution {
public:
    static bool cmp(const vector<int>& a, const vector<int>& b)
    {
        if(a[0] == b[0]) return a[1] < b[1];    // 身高相同,k大的在后面
        return a[0] > b[0]; // 身高大的排在前面
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(), people.end(), cmp);    // 先处理维度h
        list<vector<int>> result;
        for(int i=0; i<people.size(); ++i)
        {
            int pos = people[i][1]; // 再考虑维度k
            auto it = result.begin();  
            advance(it, pos);
            result.insert(it, people[i]);
        }
        return vector<vector<int>>(result.begin(), result.end());
    }
};
  • 时间复杂度:O(nlog n + n^2)
  • 空间复杂度:O(n)

小结

对于两个维度一起考虑的问题,其技巧是确定一边然后贪心另一边,两边一起考虑,就会顾此失彼。优先处理哪个维度,要看处理这个维度后,结果是否确定了这个维度。在这道题目中,如果优先处理k,按照k进行排序,会发现排序后的people不符合k的规则——第i个同学前面有ki个 大于等于其身高的人,没有确定维度k,因此不能优先处理k。如果优先处理h,按照h进行排序,排序后的people确实按照身高降序排列,这确定了维度h,因此要先处理维度h

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2069995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32基础篇:定时器 × 输入捕获

通道的概念 如下图右半部分&#xff0c;为定时器的总体结构框图&#xff1a; 可以看出&#xff0c;在时基单元下方&#xff0c;有四个长条形的结构&#xff0c;我们将其称之为&#xff1a;通道1~通道4&#xff1b;每一个通道都会连接一个IO引脚&#xff08;对应左半部分IO引脚…

OZON什么产品好卖丨OZON婴儿用具产品

Top1 摇铃 Деревянная стойка тренажер Монтессори для мобилей и игрушек для новорожденных / развивающая дуга 商品id&#xff1a;1557614414 月销量&#xff1a;707 OZON婴儿用具…

MSSQL 手工注入(第一关)

简介 SQL注入是一种安全漏洞&#xff0c;通过它可以执行意外的SQL命令或访问数据库中的信息。MSSQL注入通常发生在应用程序将用户输入作为SQL查询的一部分执行时&#xff0c;而没有对输入进行适当的验证或清理。 以下是MSSQL手工注入的流程&#xff1a; 一、打开靶场选择第一关…

进阶岛 多模态模型部署微调实践

一、任务介绍 follow 教学文档和视频使用QLoRA进行微调模型&#xff0c;复现微调效果&#xff0c;并能成功讲出梗图.尝试使用LoRA&#xff0c;或调整xtuner的config&#xff0c;如LoRA rank&#xff0c;学习率。看模型Loss会如何变化&#xff0c;并记录调整后效果(选做&#x…

【Electron】桌面应用开发启动直接打开一个网址或者浏览器打开一个网址

【Electron】桌面应用开发启动时直接打开一个网址或者跳转浏览器打开一个网址 前一篇有写过 Electron 桌面应用开发快速入门到打包Windows应用程序 但是现在需要程序打开的时候直接打开一个链接&#xff0c;在程序的窗口打开或者直接跳转浏览器打开 一、启动时直接打开一个网…

后端完成api顺序

contoroller层 Service层 点击getById&#xff0c;如果没有getById函数就先声明一个 然后完成函数体 db层 数据访问对象.数据库方法 //作用是提供对数据库中特定表的操作方法

【Hot100】LeetCode—437. 路径总和 III

目录 1- 思路前缀和哈希表dfs 2- 实现⭐437. 路径总和 III——题解思路 3- ACM 实现 题目连接&#xff1a;437. 路径总和 III 1- 思路 前缀和哈希表dfs ① 前缀和 求二叉树的前缀和&#xff0c;每求一次用一个 sum 传参记录更新 ② 哈希表 key 为前缀和 &#xff0c;value…

k8s集群部署(sealos)

目录 部署Ubuntu22和k8s环境 环境准备 虚拟机安装ubantu 配置hosts 配置静态ip地址 配置国内阿里云的源 Master节点安装sealos软件 启用root和允许ssh远程连接 禁用firewalld和iptables 关闭交换分区 配置ipvs功能 配置时间同步 使用sealos部署k8s集群 增加K8s的ma…

[Linux#46][线程->网络] 单例模式 | 饿汉与懒汉 | 自旋锁 |读写锁 | 网络基础 | 书单

目录 1.线程安全 1.1 线程安全的单例模式 1.2 饿汉与懒汉实现方式&#xff1a; 实操 2.锁 3.读者写者问题 实操 4.网络基础 4.1 初始协议 书单&#xff1a; 1.线程安全 STL中的容器和智能指针的线程安全性整理如下&#xff1a;STL容器线程安全性&#xff1a; 状态&…

zdppy+vue3+onlyoffice文档管理系统实战 20240823上课笔记 Python缓存框架的进一步封装

上节课遗留问题 封装一些简单的方法&#xff0c;比如&#xff1a; set&#xff1a;设置缓存&#xff0c;带默认超时时间get&#xff1a;获取缓存delete&#xff1a;删除缓存delete_all&#xff1a;清空缓存 封装set方法 基本方法 from zdppy_cache import Cache# 创建缓存…

文字游侠AI工具:一个高效内容创作的革命性助手,效率一键提高20倍!

在当今快节奏、高效率要求的信息时代&#xff0c;传统的内容生产方式已经难以满足不断增长的网络信息需求。随着人工智能技术的飞速发展&#xff0c;一系列创新的AI工具应运而生&#xff0c;极大地改变了我们处理信息和创造内容的方式。其中&#xff0c;文字游侠AI工具凭借其出…

校友会系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;校友管理&#xff0c;生活模块管理&#xff0c;兼职信息管理&#xff0c;表白墙管理&#xff0c;我的收藏管理&#xff0c;校友论坛&#xff0c;系统管理 微信端账号功能包括&…

css实现闪烁渐变背景,@property自定义属性

自 2024 年 7 月起&#xff0c;此功能适用于最新的设备和浏览器版本。此功能可能无法在较旧的设备或浏览器中使用。 property 是 CSS 中一个相对较新的功能&#xff0c;主要用于定义自定义属性&#xff08;即 CSS 变量&#xff09;的类型、继承性以及初始值。它允许开发者更好地…

DevEco Studio 预览器报错踩坑

This module is referencing one or more HSPs and cannot be previewed. To preview components in an HSP, switch to the HSP first. 不知道大家遇见这个问题没有 是因为我们在使用name跳转别的模块的页面时 引入了hsp模块进来 所以他在编译的时候 告诉我们这个模块中引…

pyro 教程 时间序列 单变量,重尾,python pytorch,教程和实例 Forecasting预测,布朗运动项、偏差项和协变量项

预测I:单变量&#xff0c;重尾 本教程介绍了预测模块&#xff0c;用Pyro模型进行预测的框架。本教程只涵盖单变量模型和简单的可能性。本教程假设读者已经熟悉慢病毒感染和张量形状. 另请参见: 预测II:状态空间模型 预测三:层次模型 摘要 要创建预测模型: 创建预测模型班级…

加密学中的零知识证明(Zero-Knowledge Proof, ZKP)到底是什么?

加密学中的零知识证明&#xff08;Zero-Knowledge Proof, ZKP&#xff09;到底是什么&#xff1f; 引言 在加密学的应用中&#xff0c;零知识证明&#xff08;Zero-Knowledge Proof, ZKP&#xff09;无疑是一颗璀璨的明星。它不仅挑战了我们对信息验证的传统认知&#xff0c;…

如何使用ssm实现理发店会员管理系统的设计和实现+vue

TOC ssm089理发店会员管理系统的设计和实现vue 绪论 1.1 选题背景 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。计算机软件可以针对不同行业的营业…

C语言刷题日记(附详解)(2)

一、有理数加法 输入格式&#xff1a; 输入在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数&#xff0c;其中分子和分母全是整形范围内的正整数。 输出格式&#xff1a; 在一行中按照a/b的格式输出两个有理数的和。注意必须是该有理数的最简分数形式&#xff0c;若…

OpenCSG全网首发!Phi-3.5 Mini Instruct全参微调中文版

前沿科技速递&#x1f680; &#x1f389; 震撼发布&#xff01;OpenCSG正式推出全参数微调的Phi-3.5-mini-instruct中文版模型&#xff01; &#x1f50d; 本次发布的Phi-3.5-mini-instruct中文版模型基于最新的Phi-3.5架构&#xff0c;经过全参数微调&#xff0c;专为中文场景…

软件测试——JMeter安装配置

文章目录 JMeter介绍JMeter下载及配置配置错误 提示此时不应有...修改语言为中文 JMeter介绍 Apache JMeter 是 Apache 组织基于 Java 开发的压⼒测试⼯具&#xff0c;⽤于对软件做性能测试 JMeter下载及配置 环境要求&#xff1a;JDK版本在1.8及以上 下载压缩包&#xff0c;…