本文主要是介绍代码随想录算法训练营Day33 | 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
代码随想录算法训练营Day33 | 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果
LeetCode 1005.K次取反后最大化的数组和
题目链接:LeetCode 1005.K次取反后最大化的数组和
思路:
按绝对值排序
class Solution {
public:bool static cmp(int a, int b){return abs(a) > abs(b);}int largestSumAfterKNegations(vector<int>& nums, int k) {sort(nums.begin(), nums.end(), cmp);int res = 0;for(int i = 0; i < nums.size(); i++){if(k > 0 && nums[i] < 0){nums[i] *= -1;k --;}}if(k%2) nums[nums.size()-1] *= -1;for(int num: nums) res += num;return res;}
};
注意 :
- 绝对值排序从大到小,如果剩余的k为奇数,则取反绝对值最小的元素。
LeetCode 134. 加油站
题目链接:LeetCode 134. 加油站
思路:
如果当前剩余小于0,则无论从前面哪个站出发,curSum均小于0,则从i+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){start = i+1;curSum = 0;} }if(totalSum < 0) return -1;return start;}
};
LeetCode 135. 分发糖果
题目链接:LeetCode 135. 分发糖果
思路:
从左往右,依次+1 从右往左, 依次+max(+1,cur)
class Solution {
public:int candy(vector<int>& ratings) {if(ratings.size()<=1) return ratings.size();vector<int> vecCandy(ratings.size(),1);//from left to rightfor(int i=1; i<ratings.size(); i++){if(ratings[i] > ratings[i-1]) vecCandy[i] = vecCandy[i-1] + 1;} //from right to leftfor(int i=ratings.size()-2; i>=0; i--){if(ratings[i] > ratings[i+1]) vecCandy[i] = max(vecCandy[i], vecCandy[i+1]+1);}int res = 0;for(int candy:vecCandy) res += candy;return res;}
};
注意 :
- 注意 是加前一个的.
这篇关于代码随想录算法训练营Day33 | 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!