目录
1005 K次取反后最大化的数组和
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());//先排个序
int num = 0;//记录有几个负数
int sum = 0;//记录最终和
for(int i = 0; i < nums.size();i++){
if(nums[i] < 0){
num++;
}else if(nums[i] > 0){
break;
}
}
if(num >= k){//负数的数量比k值大,说明数组里面还是有负数,那么把前几个数取正后求和就可以
for(int i = 0; i < nums.size(); i++){
if(i < k){//下标比k值小就给当前的数加负号
sum += (-nums[i]);
}else{
sum += nums[i];
}
}
}
if(num < k){//负数数量比k值少,说明数组全正数,但是要判断第一个数的正负
for(int i = 0; i < nums.size(); i++){
nums[i] = abs(nums[i]);
sum += nums[i];//先把数组里面的数取正然后单独判断第一个数是正是负
}
sort(nums.begin(), nums.end());//从新排序一下把最小值弄到前面去
k = (k-num) % 2;//把k和负数的数量减一下,然后除以二就可以判断要不要加符号
if(k == 0){//如果是偶数
return sum;
}else{
sum = sum + (-1)*nums[0]*2;
}
}
return sum;
}
};
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){//小于0直接返回
return -1;
}
return start;
}
};
135 分发糖果
class Solution {
public:
int candy(vector<int>& ratings) {
int result = 0;
vector<int> can(ratings.size(), 1);
//1 先从右边比左边大开始,遍历顺序从左向右
for(int i = 1; i < ratings.size(); i++){
if(ratings[i] > ratings[i-1]){
can[i] = can[i-1] + 1;
}
}
//2 再判断左边比右边大,遍历顺序从右向左
for(int i = ratings.size()-2; i >= 0; i--){
if(ratings[i] > ratings[i+1]){
//比较原本的值和右边糖果值+1哪个大
can[i] = max(can[i], can[i+1]+1);
}
}
//3 把糖果数组里面的值加起来
for(int i = 0; i < can.size(); i++){
result += can[i];
}
return result;
}
};