代码随想录算法训练营29期Day34|LeetCode 1005,134,135

文档讲解:K次取反后最大化的数组和  加油站  分发糖果

1005.K次取反后最大化的数组和

题目链接:https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/

思路:

        很简单,我们每次取数组中最小值取反即可。如果这个数是负数,那么对答案增益最多,如果最小值是整数,那么对答案损失最少。

        维护小根堆可以用优先队列。

核心代码:

class Solution {
public:
    int largestSumAfterKNegations(vector& nums, int k) {
        priority_queue,greater> q;
        for(int i=0;i

134.加油站

题目链接:https://leetcode.cn/problems/gas-station/description/

思路:

        如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。

        每个加油站的剩余量rest[i]为gas[i] - cost[i]。

        i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。

        如果最后还是负,就证明无解。否则就以记录的点为起点就行了。

核心代码:

class Solution {
public:
    int canCompleteCircuit(vector& gas, vector& 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;
                curSum = 0;   
            }
        }
        if (totalSum < 0) return -1; 
        return start;
    }
}; 

135.分发糖果

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路:

        这题其实也不难。

        我们按照分数从低到高分糖果,检测这个学生左右是否分过了,如果分过,证明他身侧有成绩比他低的,给他分两侧的最大糖果数加一就行了,这样能保证成绩越好糖果越多。如果他两侧没分过糖果,证明他成绩在周围最低,给他分一个就行了。全部分配完后把每个人糖果数加和就行了。

        维护分数从低到高的小根堆用优先队列即可。

核心代码:

class Solution {
private:
    struct student{
        int grade;
        int x;
        bool operator < (const student a)const{
            return grade (const student a)const{
            return grade>a.grade;
        }
    };
    priority_queue,greater> q;
public:
    int candy(vector& ratings) {
        int n=ratings.size();
        vector nums(n,0);
        student cur;
        for(int i=0;i=0&&ratings[cur.x-1]

今日总结

        今日学习时长2h,题目还算可以,今天做题状态很好。

你可能感兴趣的:(代码随想录算法训练营29期,算法,leetcode,职场和发展,c++)