代码随想录算法训练营Day33 | 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果
LeetCode 1005.K次取反后最大化的数组和
题目链接:LeetCode 1005.K次取反后最大化的数组和
思路:
按绝对值排序
class Solution {
public:
bool static cmp(int a, int b){
return abs(a) > abs(b);
}
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(), nums.end(), cmp);
int res = 0;
for(int i = 0; i < nums.size(); i++){
if(k > 0 && nums[i] < 0){
nums[i] *= -1;
k --;
}
}
if(k%2) nums[nums.size()-1] *= -1;
for(int num: nums) res += num;
return res;
}
};
注意 :
- 绝对值排序从大到小,如果剩余的k为奇数,则取反绝对值最小的元素。
LeetCode 134. 加油站
题目链接:LeetCode 134. 加油站
思路:
如果当前剩余小于0,则无论从前面哪个站出发,curSum均小于0,则从i+1出发即可。
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) return -1;
return start;
}
};
LeetCode 135. 分发糖果
题目链接:LeetCode 135. 分发糖果
思路:
从左往右,依次+1 从右往左, 依次+max(+1,cur)
class Solution {
public:
int candy(vector<int>& ratings) {
if(ratings.size()<=1) return ratings.size();
vector<int> vecCandy(ratings.size(),1);
//from left to right
for(int i=1; i<ratings.size(); i++){
if(ratings[i] > ratings[i-1]) vecCandy[i] = vecCandy[i-1] + 1;
}
//from right to left
for(int i=ratings.size()-2; i>=0; i--){
if(ratings[i] > ratings[i+1]) vecCandy[i] = max(vecCandy[i], vecCandy[i+1]+1);
}
int res = 0;
for(int candy:vecCandy) res += candy;
return res;
}
};
注意 :
- 注意 是加前一个的.