class Solution {
public:
static bool cmp(int a, int b) {
return abs(a) > abs(b);
}
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(), nums.end(), cmp);
int i = 0;
int n = nums.size();
int ans = 0;
while (k && i < n) {
if (nums[i] < 0) {
k--;
nums[i] = -nums[i];
}
i++;
}
ans = accumulate(nums.begin(), nums.end(), 0);
if (k) {
if (k % 2 == 0) return ans;
return ans - 2 * nums[n - 1];
}
return ans;
}
};
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = gas.size();
int s = 0;
int rest = 0;
int ans = 0;
for (int i = 0; i < n; i++) {
s += gas[i] - cost[i];
rest += gas[i] - cost[i];
if (rest < 0) {
ans = i + 1;
rest = 0;
}
}
if (s < 0) return -1;
return ans;
}
};
从左到右遍历,如果rating比左边的大,则将自己的糖果改成左边糖果+1
再从右到左边遍历,如果rating比右边的大,则将自己的糖果改成右边糖果+1,或者不变
class Solution {
public:
int candy(vector<int>& ratings) {
int n = ratings.size();
vector<int> c(n, 1);
for (int i = 1; i < n; i++) {
if (ratings[i] > ratings[i - 1]) c[i] = c[i - 1] + 1;
}
for (int i = n - 2; i >= 0; i--) {
if (ratings[i] > ratings[i + 1]) c[i] = max(c[i + 1] + 1, c[i]);
}
int ans = accumulate(c.begin(), c.end(), 0);
return ans;
}
};