代码随想录算法训练营第三十六天
1005.K次取反后最大化的数组和
题目链接:1005.K次取反后最大化的数组和
class Solution {
public:
static bool sort_abs(int a,int b){
return abs(a)>abs(b);
}
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(),nums.end(),sort_abs);//绝对值排序
for(auto &num:nums){//整个数组里面负数反转
if(k>0&&num<0){
num*=-1;
k--;
}
}
if(k%2==1)nums[nums.size()-1]*=-1;//如果k大于数组长度,将最后小的一个数进行翻转
int result = 0;
for(int i:nums){
result+=i;
}
return result;
}
};
134. 加油站
题目链接:134. 加油站
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
vector<int> dif(gas.size());
int max_dif_index = 0;
int sum =0;
int total_sum = 0;
for(int i = 0 ;i<dif.size();i++){
dif[i] = gas[i]-cost[i];
sum+=dif[i];
total_sum+=dif[i];
if(sum<0){//剩余油量加和大于0才有可能是起点,所以要在最后一个负数之后
max_dif_index =i+1;
sum = 0;
}
}
if(total_sum<0)return -1;//不管从哪是起点,整个数组加和如果小于0,肯定没有符合要求的开头
return max_dif_index;
}
};
135. 分发糖果
题目链接:135. 分发糖果
class Solution {
public:
int candy(vector<int>& ratings) {
vector<int> candy(ratings.size(), 1);
int sum =0;
for (int i = 1; i < candy.size(); i++) {//从左向右处理一遍,如果当前的比左边的大就多给一个
if (ratings[i] > ratings[i - 1])
candy[i] = candy[i - 1] + 1;
}
for (int i = candy.size() - 2; i >= 0; i--) {//从右向左再处理一遍,如果当前大比右边大就多给一个,再和之前处理结果进行比较,取更多的一个
if (ratings[i] > ratings[i + 1])
candy[i] = max(candy[i], candy[i + 1] + 1);
}
for(int &i:candy){
sum+=i;
}
return sum;
}
};