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


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

    本题简单一些,估计大家不用想着贪心 ,用自己直觉也会有思路。 

    代码随想录

    贪心的思路,局部最优:让绝对值大的负数变为正数,当前数值达到最大,整体最优:整个数组和达到最大。

    局部最优可以推出全局最优。

    那么如果将负数都转变为正数了,K依然大于0,此时的问题是一个有序正整数序列,如何转变K次正负,让 数组和 达到最大。

    那么又是一个贪心:局部最优:只找数值最小的正整数进行反转,当前数值和可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了),全局最优:整个 数组和 达到最大。

    1. public int largestSumAfterKNegations(int[] nums, int k) {
    2. Arrays.sort(nums);
    3. for(int i=0;i0;i++){
    4. if(i>=nums.length){
    5. Arrays.sort(nums);
    6. i=i-nums.length;
    7. if(nums[i]<0){
    8. nums[i]=-nums[i];
    9. k--;
    10. }else if( k%2==0){
    11. break;
    12. }else if(k%2==1){
    13. Arrays.sort(nums);
    14. nums[0]=-nums[0];
    15. break;
    16. }
    17. }else{
    18. if(k==0){
    19. break;
    20. }
    21. if(nums[i]<0){
    22. nums[i]=-nums[i];
    23. k--;
    24. }else if( k%2==0){
    25. break;
    26. }else if(k%2==1){
    27. Arrays.sort(nums);
    28. nums[0]=-nums[0];
    29. break;
    30. }
    31. }
    32. }
    33. IntStream stream = Arrays.stream(nums);
    34. int sum = stream.sum();
    35. return sum;
    36. }

     134. 加油站 

    本题有点难度,不太好想,推荐大家熟悉一下方法二 

    代码随想录

    1. public int canCompleteCircuit(int[] gas, int[] cost) {
    2. int curSum = 0;
    3. int totalSum = 0;
    4. int index = 0;
    5. for (int i = 0; i < gas.length; i++) {
    6. curSum += gas[i] - cost[i];
    7. totalSum += gas[i] - cost[i];
    8. if (curSum < 0) {
    9. index = (i + 1) % gas.length ;
    10. curSum = 0;
    11. }
    12. }
    13. if (totalSum < 0) return -1;
    14. return index;
    15. }
    16. 时间复杂度:O(n)
    17. 空间复杂度:O(1)

     135. 分发糖果 

    本题涉及到一个思想,就是想处理好一边再处理另一边,不要两边想着一起兼顾,后面还会有题目用到这个思路 

    代码随想录

    1. /**
    2. 分两个阶段
    3. 1、起点下标1 从左往右,只要 右边 比 左边 大,右边的糖果=左边 + 1
    4. 2、起点下标 ratings.length - 2 从右往左, 只要左边 比 右边 大,此时 左边的糖果应该 取本身的糖果数(符合比它左边大) 和 右边糖果数 + 1 二者的最大值,这样才符合 它比它左边的大,也比它右边大
    5. */
    6. public int candy(int[] ratings) {
    7. int len = ratings.length;
    8. int[] candyVec = new int[len];
    9. candyVec[0] = 1;
    10. for (int i = 1; i < len; i++) {
    11. candyVec[i] = (ratings[i] > ratings[i - 1]) ? candyVec[i - 1] + 1 : 1;
    12. }
    13. for (int i = len - 2; i >= 0; i--) {
    14. if (ratings[i] > ratings[i + 1]) {
    15. candyVec[i] = Math.max(candyVec[i], candyVec[i + 1] + 1);
    16. }
    17. }
    18. int ans = 0;
    19. for (int num : candyVec) {
    20. ans += num;
    21. }
    22. return ans;
    23. }

  • 相关阅读:
    RabbitMQ消息确认机制
    轻量化网络 Mobilenet V1/V2/V3 学习记录
    【Redis】数据介绍 & 通用命令 & String类型
    【算法分析与设计】贪心算法(上)
    Java Servlet JSP使用Gson 输出JSON格式数据
    支持笔记本电脑直插直充,TOWE 65W智能快充PDU超级插座
    COLING 2022 | 清华美团提出DABERT:针对匹配任务的双通道注意力增强预训练模型...
    实验4 SQL的复杂多表查询以及视图
    Nginx之配置文件及基础概念解读
    [附源码]计算机毕业设计springboot农产品销售网站
  • 原文地址:https://blog.csdn.net/a20010616/article/details/132900898