力扣第27天----第1005题、第134题、第135题

# 力扣第27天----第1005题、第134题、第135题

一、第1005题–K次取反后最大化的数组和

​ 按绝对值大小,从大到小遇到负数,就翻转。把绝对值大的负数翻转过来,然后再求和。直到k用尽,或者数组遍历完,用完了也每一个数组元素加入其中。最终数组遍历完后,如果k为奇数,把数组最后一个元素翻转1次,再加到result中,要乘以2,抵消前面的最后一个加操作。

class Solution {
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end(), [&](int i, int j){return abs(i) > abs(j);});
        int result = 0;
        for(int i =0; i<nums.size(); i++){
            if(nums[i] < 0 && k>0){
                k--;
                nums[i] = -nums[i];   
            }
            result +=  nums[i];
        }
        if(k&1){
            nums[nums.size()-1] = -nums[nums.size()-1];
            //cout << result << endl;
            result +=  2*nums[nums.size()-1];
           // cout << result << endl;
        }
        return result;
    }
};

二、第134题–加油站

​ 根据当前的gas、cost判断,能不能到下一节点。如果不能,起始位置跳到下一节点,再进行判断,逐渐推进下去,直到最后一个。另外还要统计全局gas和cost的和,如果gas的和小于cost的和为负,直接返回-1;如果为正,那么最后一个满足情况的点就是结果。

​ 判断是否满足情况,通过cur判断–从起始点到当前位置的和,这个起始点是从上一个结束点开始的位置。

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int result = 0;
        int cur = 0;
        int n = 0;
        for(int i=0; i<gas.size(); i++){
            result += gas[i] - cost[i];
            cur += gas[i] - cost[i];
            if (cur <0){
                cur = 0;
                n = i+1;
            }
        }
        if(result < 0) return -1;
        else return n;
    }
};

三、第135题–分发糖果

​ 没想到,这是道难类型的题。同时处理2个方向,容易出错。两个方向单独处理,从左到右比较一遍,再从右到左比较一遍。

class Solution {
public:
    int candy(vector<int>& ratings) {
        int result = 0;
        vector<int> cn(ratings.size(), 1);
        for(int i =1; i<ratings.size(); i++){
            if(ratings[i] > ratings[i-1]) cn[i]  = cn[i-1] + 1;
        }
      //  for_each(cn.begin(), cn.end(), [](auto i){cout << i << ' ';});
       // cout << endl;
        for(int j = ratings.size()-2; j>=0; j--){
            if(ratings[j] > ratings[j+1]){
                cn[j]  = max(cn[j+1] + 1, cn[j]);
            } 
            result += cn[j];
        }
        //for_each(cn.begin(), cn.end(), [](auto i){cout << i << ' ';});
        //cout << endl;
        return result + cn[ratings.size() - 1];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值