代码随想录算法训练营第三十四天| 1005.K次取反后最大化的数组和,134. 加油站,135. 分发糖果

本文分享了解决MaximizeSumOfArrayAfterKNegations问题的思路,通过绝对值排序实现最大和。同时介绍了GasStation的贪心算法解决加油站路径问题,以及Candy问题中如何利用贪心策略调整糖果分配。
摘要由CSDN通过智能技术生成

1005. Maximize Sum Of Array After K Negations

  • 思路
    • 此题难度是按绝对值排列,先背下来吧
    • 先按绝对值大小倒序排列
    • 从大到小
      • 如果是负数则取相反数
      • k--
    • 如果遍历完毕全为正了K还有富裕
      • k是否为偶数
        • 如果为偶数
          • 不管
        • 如果为奇数
          • 最小值取负值
    • java
      
      class Solution {
          public int largestSumAfterKNegations(int[] nums, int k) {
              //数列按绝对值大小倒序排列
            nums = IntStream.of(nums)
                      .boxed().sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))
                      .mapToInt(Integer::intValue)
                      .toArray();
              int len = nums.length;
              for(int i = 0; i< len ;i++){
                  if(nums[i]0){
                      nums[i] *= -1;
                      k--;
                  }
              }
              if(k %2 != 0){
                  nums[len-1] *= -1;
              }
            //数列求和也可以记一下;
              return Arrays.stream(nums).sum();
          }
      }
      

 134. Gas Station

  • 思路
    • 贪心
      • 首先算出每个站的剩余balance
        • balance = gas[i] - cost [i];
      • 累加balance如果为负数
        • return -1
      • 遍历数组,累加balance
        • 如果balance为负
          • 为负说明这个点为start到不了下一个点,设置下一个index为start
          • cuSum更新为0,因为已经是下一个点为start了,
    • java
      
      class Solution {
          public int canCompleteCircuit(int[] gas, int[] cost) {
              int curSum = 0;
              int totalSum = 0;
              int start = 0;
              for (int i = 0 ; i < gas.length; i++){
                  int balance = gas[i] - cost[i];
                  curSum += balance;
                  totalSum += balance;
                  
                  if(curSum < 0){
                      start = i + 1;
                      curSum = 0;
                  }
              }
              if(totalSum < 0){
                  return -1;
              }
              return start;
          }
      }
      
      

 135. Candy

 

  • 思路
    • 贪心
    • 先顺序遍历,确定右孩子比左孩子分高的情况
    • 再逆序遍历,确定左孩子比右孩子分高的情况
      • if(ratings[i] > ratings[i + 1 ]){candyList[i] = Math.max(candyList[i], candyList[i+1]+1);
    • java
      
      
      class Solution {
          public int candy(int[] ratings) {
              int[] candyList = new int[ratings.length];
              candyList[0] = 1;
              for(int i = 1; i < ratings.length; i++){
                  candyList[i] = (ratings[i] >ratings[i - 1] ) ? candyList[i-1] + 1: 1;
              }
              
              for(int i = ratings.length-2; i >= 0; i--){
                  if(ratings[i] > ratings[i + 1 ]){
                      candyList[i] = Math.max(candyList[i], candyList[i+1]+1);
                  }            
              }
              return Arrays.stream(candyList).sum();
                      
          }
      }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值