1005.K次取反后最大化的数组和
这道题难度较小,思路也简单,将数组中所有数按绝对值排序后,把负数依次变正即可
如果k消耗完,那输出即可,如果剩余K为偶数,那不影响结果,反之将最小的数变负即可,
class Solution {
static bool cmp(int a, int b) {
return abs(a) > abs(b);
}
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
int result = 0;
sort(nums.begin(),nums.end(),cmp);
for (int i = 0; i < nums.size();i++){
if (nums[i] < 0 && k > 0){
result += -nums[i];
k--;
} else {
result += nums[i];
}
}
if (k%2 == 1) result -=2*abs(nums[nums.size()-1]);
return result;
}
};
134. 加油站
如果总油耗大于总花费,那一定能到终点,所以我们只要从最后一个gas[i]-cost[i]小于零的下一位开始起泡即可。
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;
}
};
135. 分发糖果
左到右和右到左遍历两次
class Solution {
public:
int candy(vector<int>& ratings) {
int n = ratings.size();
vector <int> nums(n);
for (int i = 0; i < n; i++){//左到右
if (i > 0 && ratings[i] > ratings[i-1]) {
nums[i] = nums[i-1]+1;
} else {
nums[i] = 1;
}
}
int a = 0,sum = 0;
for (int i = n-1; i >= 0; i--){//右到左
if (i < n-1 && ratings[i] > ratings[i+1]) {
a++;
} else {
a = 1;
}
sum += max(nums[i], a);
}
return sum;
}
};