# 力扣第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];
}
};