当前位置:   article > 正文

代码随想录训练营Day25:贪心算法:加油站、分发糖果和K次取反的最大数组和

代码随想录训练营Day25:贪心算法:加油站、分发糖果和K次取反的最大数组和

1.1005K次取反后最大化的数组和

贪心策略:先按照绝对值的大小进行排序,绝对值大的排在前面,然后按照顺序,如果存在负值就翻转直到用完k次,或者遍历完之后,将最小的那个进行翻转即可。

  1. class Solution {
  2. public:
  3. static bool cmp(int a,int b){
  4. return abs(a)>abs(b);
  5. }
  6. int largestSumAfterKNegations(vector<int>& nums, int k) {
  7. //思路,先将这个数组中小的那个进行翻转,然后如果还有多的,就找到最小的那个进行翻转即可。
  8. sort(nums.begin(),nums.end(),cmp);
  9. for(int i = 0;i<nums.size();i++){
  10. if(nums[i]<0&&k>0){
  11. nums[i] *= -1;
  12. k--;
  13. }
  14. }
  15. int flags = 1;
  16. if(k%2==1){
  17. flags = -1;
  18. }
  19. nums[nums.size()-1] *= flags;
  20. int result = 0;
  21. for(auto num:nums) result += num;
  22. return result;
  23. }
  24. };

2.134加油站

贪心策略:直接从i开始双重for循环遍历,当消耗的油量大于获得的油量就继续遍历,如果找到了一个循环,返回即可。

  1. class Solution {
  2. public:
  3. int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
  4. int n = gas.size();
  5. int i = 0;
  6. while (i < n) {
  7. int sumOfGas = 0, sumOfCost = 0;
  8. int cnt = 0;
  9. while (cnt < n) {
  10. int j = (i + cnt) % n;
  11. sumOfGas += gas[j];
  12. sumOfCost += cost[j];
  13. if (sumOfCost > sumOfGas) {
  14. break;
  15. }
  16. cnt++;
  17. }
  18. if (cnt == n) {
  19. return i;
  20. } else {
  21. i = i + cnt + 1;
  22. }
  23. }
  24. return -1;
  25. }
  26. };

3.135分发糖果

贪心策略:这里用到了两次贪心,分别是从左往右和从右往左两次。

对第一次贪心:从左往右进行遍历,如果大于前一个则在前面那个数字+1

对第二次贪心:这次的贪心需要在前面的基础上进行操作。还是按照第一次贪心的类似的思路,从右往左,比较当前值和右边值的大小,如果大则+1,此时重点在:需要比较candyVec[i] = max(candyVec[i],candyVec[i+1]+1);因为我们需要同时满足两边的条件,所以需要取最大值。

最后累加求得结果即可。

  1. class Solution {
  2. public:
  3. //两次贪心:第一次是从左往右,第二次是从右往左,这样能够保证两边都进行了比较
  4. int candy(vector<int>& ratings) {
  5. int n = ratings.size();
  6. vector<int> candyVec(n,1);
  7. //从左往右遍历,确定大于的地方
  8. for(int i =1;i<n;i++){
  9. if(ratings[i]>ratings[i-1]){
  10. candyVec[i] = candyVec[i-1]+1;
  11. }
  12. }
  13. //从右往左遍历,确定大于的地方
  14. for(int i = n-2;i>=0;i--){
  15. if(ratings[i]>ratings[i+1]){
  16. //这个地方是核心所在,两种选择,要同时满足的贪心,所以要取最大值
  17. candyVec[i] = max(candyVec[i],candyVec[i+1]+1);
  18. }
  19. }
  20. int result = 0;
  21. for(int i =0;i<n;i++){
  22. result += candyVec[i];
  23. }
  24. return result;
  25. }
  26. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/981226
推荐阅读
相关标签
  

闽ICP备14008679号