Day33| 1005 K次取反后最大化的数组和 134 加油站 135 分发糖果

文章介绍了三个编程问题的解决方案:使用排序和取反操作最大化数组和;解决加油站加油问题,找到可以完成循环的起点;以及高效分配糖果,使每个人得到的糖果数量最大化。每个问题都涉及到了IT技术中的数据结构、算法和逻辑判断。
摘要由CSDN通过智能技术生成

目录

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

134 加油站  

135 分发糖果 


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

class Solution {
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end());//先排个序
        int num = 0;//记录有几个负数
        int sum = 0;//记录最终和
        for(int i = 0; i < nums.size();i++){
            if(nums[i] < 0){
                num++;
            }else if(nums[i] > 0){
                break;
            }
        }

        if(num >= k){//负数的数量比k值大,说明数组里面还是有负数,那么把前几个数取正后求和就可以
            for(int i = 0; i < nums.size(); i++){
                if(i < k){//下标比k值小就给当前的数加负号
                    sum += (-nums[i]);
                }else{
                    sum += nums[i];
                }
            }
        }

        if(num < k){//负数数量比k值少,说明数组全正数,但是要判断第一个数的正负
            for(int i = 0; i < nums.size(); i++){
                nums[i] = abs(nums[i]);
                sum += nums[i];//先把数组里面的数取正然后单独判断第一个数是正是负
            }
            sort(nums.begin(), nums.end());//从新排序一下把最小值弄到前面去
            k = (k-num) % 2;//把k和负数的数量减一下,然后除以二就可以判断要不要加符号
            if(k == 0){//如果是偶数
                return sum;
            }else{
                sum = sum + (-1)*nums[0]*2;
            }
        }
        return sum;
    }
};

 

134 加油站  

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;
                cursum = 0;   
            }
        }

        if(totalsum < 0){//小于0直接返回
            return -1;
        }
        return start;
    }
};

135 分发糖果 

class Solution {
public:
    int candy(vector<int>& ratings) {
        int result = 0;
        vector<int> can(ratings.size(), 1);
        //1 先从右边比左边大开始,遍历顺序从左向右
        for(int i = 1; i < ratings.size(); i++){
            if(ratings[i] > ratings[i-1]){
                can[i] = can[i-1] + 1; 
            }
        }

        //2 再判断左边比右边大,遍历顺序从右向左
        for(int i = ratings.size()-2; i >= 0; i--){
            if(ratings[i] > ratings[i+1]){
                //比较原本的值和右边糖果值+1哪个大
                can[i] = max(can[i], can[i+1]+1);
            }
        }

        //3 把糖果数组里面的值加起来
        for(int i = 0; i < can.size(); i++){
            result += can[i];
        }
        return result;
    }
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值