题目:1005.K次取反后最大化的数组和
文章链接:代码随想录
视频链接:LeetCode:1005.K次取返后最大化的数组和
题目链接:力扣题目链接
图释:
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); // 按绝对值进行排序
for(int i=0; i<nums.size(); i++){
if(nums[i] < 0 && k>0){ // 如果有负数,将其取反
nums[i] *= -1;
k--;
}
}
// 当已经没有负数时,以及k为奇数时,取反绝对值最小的值
if(k%2==1) nums[nums.size()-1] *= -1;
int result = 0;
for(int i=0; i<nums.size(); i++){
result += nums[i];
}
return result;
}
};
题目:134. 加油站
文章链接:代码随想录
视频链接:LeetCode: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;
}
};
题目:135. 分发糖果
文章链接:代码随想录
视频链接:LeetCode:135.分发糖果
题目链接:力扣题目链接
图释:
class Solution {
public:
int candy(vector<int>& ratings) {
vector<int> condy (ratings.size(), 1); // 初始化为1,每个孩子都有一个糖果
// 情况一, 右孩子比左孩子大
for(int i=1; i<ratings.size(); i++){
if(ratings[i]>ratings[i-1]){
condy[i] = condy[i-1]+1; // 比左孩子的糖果多一个
}
}
// 情况二, 左孩子比右孩子大, 从后往前遍历
for(int i=ratings.size()-2; i>=0; i--){
if(ratings[i]>ratings[i+1]){
condy[i] = max(condy[i+1]+1 , condy[i]); // 取最大值,两边遍历的最大值
}
}
// 统计糖果
int result = 0;
for(int i=0; i<ratings.size(); i++){
result += condy[i];
}
return result;
}
};