1005.K次取反后最大化的数组和
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
for (int i=0; i<k; i++){
nums[0]*=-1;
sort(nums.begin(), nums.end());
}
int sum=0;
for (int i=0; i<nums.size(); i++){
sum+=nums[i];
}
return sum;
}
};
三种情况:
1、负数总是对sum造成负影响,所以我们的希望绝对值大的负数取反为正数。
2、0没影响,所以当序列元素均大于等于0时,可以不断对0操作保证不对sum产生负影响。
3、越小的正数取反对sum影响越小。
思路:将整个序列排序后,总是对较小的数取反,每次取反后重新排序。
134. 加油站
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
// rest[i] = gas[i]-cost[i];用于说明每段的路程的余油量,
// 如果sum of rest小于0,说明这段路程是无法到达的,将路径更新从i+1的位置重新出发
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){
curSum=0;
start=i+1;
}
}
if (totalSum<0) return -1;
return start;
}
};
135. 分发糖果
class Solution {
public:
int candy(vector<int>& ratings) {
int sum=0;
vector<int> candyArr(ratings.size(), 1);
for (int i=1; i<ratings.size(); i++){
if (ratings[i]>ratings[i-1]){//右边比左边大
candyArr[i] =candyArr[i-1]+1;
}
}
for (int i=ratings.size()-2; i>=0; i--){
if (ratings[i]>ratings[i+1]){//左边比右边大
candyArr[i] = max(candyArr[i], candyArr[i+1]+1);
}
}
for (int i : candyArr)
sum+=i;
return sum;
}
};
糖果数量是要和相邻元素进行比较,而不要同时比较。
先遍历一遍再遍历另一边。