1005.K次取反后最大化的数组和
文档链接:[代码随想录]
题目链接:1005.K次取反后最大化的数组和
题目:
给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:
选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
重复这个过程恰好 k 次。可以多次选择同一个下标 i 。
以这种方式修改数组后,返回数组 可能的最大和 。
class Solution {
static bool cmp(int a, int b){
return abs(a) > abs(b);
}
public:
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--;
}
}
if(k % 2 == 1) nums[nums.size() -1] *= -1;
int sum = 0;
for(int num : nums)sum += num;
return sum;
}
};
134. 加油站
题目:
在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。
注意:
这道题不好想
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) { // 当前累加rest[i]和 curSum一旦小于0
start = i + 1; // 起始位置更新为i+1
curSum = 0; // curSum从0开始
}
}
if (totalSum < 0) return -1; // 说明怎么走都不可能跑一圈了
return start;
}
};
135. 分发糖果
题目:
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
注意:
将整个题目分成两部分解决,先从左往右后从右4往左
class Solution {
public:
int candy(vector<int>& ratings) {
vector<int> candys(ratings.size(),1);
for(int i = 0;i < ratings.size()-1;i++){
if(ratings[i + 1] > ratings[i]){
candys[i + 1] = candys[i] + 1;
}
}
for(int i = ratings.size() - 1;i > 0;i--){
if(ratings[i] < ratings[i -1]){
candys[i - 1] = max(candys[i] + 1,candys[i - 1]);
}
}
int sum = 0;
for(int i = 0;i< ratings.size();i++){
sum+=candys[i];
}
return sum;
}
};