1005.K次取反后最大化的数组和
按照绝对值从大到小排序,处理起来方便很多
class Solution {
public:
int mysum(vector<int>& nums){
int sum = 0;
for(int i = 0; i < nums.size(); i++){
sum += nums[i];
}
return sum;
}
// 按从大到小排序,因为优先取反绝对值更大的负数
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);
for(int i = 0; i < nums.size(); i++){
if(nums[i] < 0 && k > 0){
nums[i] = - nums[i];
k--;
}
}
if(k % 2 == 1) nums[nums.size()-1] = - nums[nums.size()-1];
return mysum(nums);
}
};
134. 加油站
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;
}
};
如果当前剩余的油量小于0说明跑不到了,直接跳到该位置的下一个位置
135. 分发糖果
从左至右,统计左边的情况,
从右至左,统计右边的情况,最后取左边和右边两者的最大值当作该点需要的糖果数
class Solution {
public:
int candy(vector<int>& ratings) {
int n = ratings.size();
vector<int> left(n), right(n);
for(int i = 1; i < n; i++){
if(ratings[i] > ratings[i - 1]) left[i] = left[i - 1] + 1;
}
for(int i = n - 2; i >= 0; i--){
if(ratings[i] > ratings[i + 1]) right[i] = right[i + 1] + 1;
}
int sum = 0;
for(int i = 0; i < n; i++){
//至少一个糖果 所以初始就有1个 需要+1
sum += max(left[i], right[i]) + 1;
}
return sum;
}
};