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

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

文章目录

  • 一、第1005题--K次取反后最大化的数组和
  • 二、第134题--加油站
  • 三、第135题--分发糖果

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

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

class Solution {
public:
    int largestSumAfterKNegations(vector& nums, int k) {
        sort(nums.begin(), nums.end(), [&](int i, int j){return abs(i) > abs(j);});
        int result = 0;
        for(int i =0; i0){
                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& gas, vector& cost) {
        int result = 0;
        int cur = 0;
        int n = 0;
        for(int i=0; i

三、第135题–分发糖果

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

class Solution {
public:
    int candy(vector& ratings) {
        int result = 0;
        vector cn(ratings.size(), 1);
        for(int i =1; 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];
    }
};

你可能感兴趣的:(leetcode,算法,职场和发展)