第一题 K次取反后最大化的数组和
注意比较器要设置成静态 因为静态变量不需要创建对象
class Solution {
public:
static bool cmp(const int &a,const int &b){
return abs(a) >abs(b);
}
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(),nums.end(),cmp);
int count = 0;
for(int i = 0;i <nums.size();i++){
if(k > 0 && nums[i] < 0 ){
nums[i] = -nums[i];
k--;
}
count += nums[i];
}
if(k > 0){
k = k % 2;
if(k == 0) return count;
else count -= 2 * nums[nums.size()-1];
}
return count;
}
};
第二题 加油站
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int cur = 0;
int total = 0;
int start = 0;
for(int i = 0;i <gas.size();i++){
cur += gas[i] - cost[i];
total += gas[i] - cost[i];
if(cur < 0){
start = i + 1;
cur = 0;
}
}
if(total < 0) return -1;
return start;
}
};
第三题 分发糖果
注意第二个for循环中从右往左遍历时可能candy[i]的值比2来的大但是candy[i+1]还是1 所以需要进行判断,如果比一大取大的值
class Solution {
public:
int candy(vector<int>& ratings) {
int result = 0;
vector<int> candy(ratings.size(),1);
for(int i = 1;i <ratings.size();i++){
if(ratings[i] > ratings[i-1]){
candy[i] = candy[i-1] + 1;
}
}
for(int i = ratings.size()-2; i >=0;i--){
if(ratings[i+1] < ratings[i]){
candy[i] = max(candy[i],candy[i+1]+1);
}
}
for(int i = 0; i< candy.size();i++){
result += candy[i];
}
return result;
}
};