Day34 贪心算法 part03 1005. K 次取反后最大化的数组和 134. 加油站 135. 分发糖果

贪心算法 part03 1005. K 次取反后最大化的数组和 134. 加油站 135. 分发糖果

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

思路

  • 第一步,从前向后遍历,遇到负数将其变为正数,同时K--
  • 第二步:如果K还大于0,那么反复转变数值最小的元素,将K用完
  • 第三步:求和
c 复制代码
class Solution {
public:
    static bool Compare(int& a, int& b){
        return abs(a) > abs(b);
    }
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        sort(nums.begin(),nums.end(),Compare); //绝对值排序
        for(int i = 0; i<nums.size();i++){
            if(nums[i]<0 && k>0){ //第一步贪心,取绝对值最大的数确保为正数
                nums[i] = -nums[i];
                k--;
            }
        }
        if(k%2==1) nums[nums.size()-1] *= -1; //第二步贪心,如果k还有剩余,进行绝对值最小数的操作
        int result = 0; //第三步,取结果
        for (int a : nums) result += a;       
        return result;
    }
};

134. 加油站

方法一(暴力)

leetcode超时(35/40)

c 复制代码
class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        for(int i = 0; i<gas.size(); i++){
            int rest = gas[i]-cost[i]; //记录当天用油差值
            int Index = (i+1)%gas.size(); //方便下面的while进行判断
            while(rest>0 && Index!=i){
                rest+=gas[Index] - cost[Index];
                Index = (Index + 1) % cost.size();
            }
            if(Index ==i && rest >=0) return i; //返回当前i
        }
        return -1;
    }
};

方法二(贪心)

c 复制代码
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) {   // 当前累加rest[i]和 curSum一旦小于0
                start = i + 1;  // 起始位置更新为i+1
                curSum = 0;     // curSum从0开始
            }
        }
        if (totalSum < 0) return -1; // 说明怎么走都不可能跑一圈了
        return start;
    }
};

135. 分发糖果

c 复制代码
class Solution {
public:
    int candy(vector<int>& ratings) {
        vector<int> candyVec(ratings.size(), 1);
        for(int i = 1; i<ratings.size();i++){ //从前往后
            if(ratings[i-1]<ratings[i]) candyVec[i] = candyVec[i-1] +1;
        }
        for(int i = ratings.size()-1; i>=1; i--){ //从后往前
            if(ratings[i] <ratings[i-1]) candyVec[i-1] =max(candyVec[i-1],candyVec[i]+1);
        }
        int result = 0;
        for (int i = 0; i < candyVec.size(); i++) result += candyVec[i];
        return result;
    }
};
相关推荐
Q741_14741 分钟前
C++ 模拟题 力扣495. 提莫攻击 题解 每日一题
c++·算法·leetcode·模拟
我命由我123451 小时前
Excel - Excel 列出一列中所有不重复数据
经验分享·学习·职场和发展·word·powerpoint·excel·职场发展
璞致电子1 小时前
fpga开发板ZYNQ 璞致 PZ7010/7020 邮票孔核心板简介-ZYNQ7000系列小系统学习板
linux·嵌入式硬件·学习·fpga开发·fpga·fpga开发板·xilinx开发板
Felven1 小时前
A. Be Positive
算法
小O的算法实验室2 小时前
2026年COR SCI2区,自适应K-means和强化学习RL算法+有效疫苗分配问题,深度解析+性能实测,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
青岛少儿编程-王老师2 小时前
CCF编程能力等级认证GESP—C++7级—20250927
数据结构·c++·算法
Miki Makimura2 小时前
Reactor 模式实现:从 epoll 到高并发调试
运维·服务器·c++·学习
夏鹏今天学习了吗2 小时前
【LeetCode热题100(39/100)】对称二叉树
算法·leetcode·职场和发展
·心猿意码·3 小时前
C++Lambda 表达式与函数对象
开发语言·c++
jiajixi3 小时前
go-swagger学习笔记
笔记·学习·golang