算法学习day28-贪心算法

买卖股票2

核心思路

  • 贪心算法

    • 如果想到其实最终利润是可以分解的,那么本题就很容易了!

      如何分解呢?

      假如第 0 天买入,第 3 天卖出,那么利润为:prices3 - prices0。

      相当于(prices3 - prices2) + (prices2 - prices1) + (prices1 - prices0)。

      此时就是把利润分解为每天为单位的维度,而不是从 0 天到第 3 天整体去考虑!

    • 要求最大利润, 那就拆分成每天都能获得正利润. 这样汇总之后就是最大利润了

    题解

    • 自己写的

      java 复制代码
      public int maxProfit(int[] prices) {
          int maxProfit = 0;
          int preProfit = 0;
          int prePrice = prices[0];
          for (int i = 1; i < prices.length; i++) {
              if (prices[i] < prePrice) {
                  maxProfit += preProfit;
                  preProfit = 0;
              } else {
                  preProfit = preProfit + prices[i] - prePrice;
              }
              prePrice = prices[i];
          }
          return maxProfit + preProfit;
      }
    • 优化

      java 复制代码
      public int maxProfit(int[] prices) {
          int result = 0;
          for (int i = 1; i < prices.length; i++) {
              //只收集 每天卖出是正利润的. 全局下就是最大利润
              result += Math.max(prices[i] - prices[i - 1], 0);
          }
          return result;
      }

跳跃游戏

核心思路

  • 要求最终能不能跳跃到最后位置, 只需要找到每个元素可跳跃的最大范围, 这样到最后, 每个元素的最大范围都求出来了, 那么全局的可跳跃的最大范围也就求出来了

    java 复制代码
    public boolean canJump(int[] nums) {
        if (nums.length <= 1) return true;
        int max = nums[0];
        for (int i = 1; i <= max; i++) {
            max = Math.max(max, i + nums[i]);
            if (max >= nums.length - 1) {
                return true;
            }
        }
        return false;
    }

跳跃游戏2

核心思路

  • 核心依然是求每个元素的最大跳跃范围.

  • 只是 在该元素的跳跃范围内, 要找到 其中的可跳跃范围最大的某个元素. 直到执行到范围末尾, count++. 并更新最大跳跃范围

    java 复制代码
    public int jump(int[] nums) {
        if (nums.length <= 1) return 0;
        int count = 0;
        //当前的最大范围
        int curDistance = 0;
        //当前范围内的, 元素的可跳跃的最大范围
        int maxDistance = 0;
        for (int i = 0; i < nums.length; i++) {
            maxDistance = Math.max(maxDistance, i + nums[i]);
            if (maxDistance >= nums.length - 1) {
                return ++count;
            }
            if (i == curDistance) {
                count++;
                curDistance = maxDistance;
            }
        }
        return count;
    }

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

核心思路

  • 这道题要怎么贪心呢, 正数越多值就越大, 那就是尽可能的将负数转正
  • 如果负数全部转正之后, k还没用完呢?
    • 那就是第二个贪心, 只对值最小的一个数进行取反, 这样得到的和就是最大的

题解

java 复制代码
public static int largestSumAfterKNegations(int[] nums, int k) {
    Arrays.sort(nums);
    for (int i = 0; i < nums.length; i++) {
        if(nums[i] < 0 && k>0){
            k--;
            nums[i] = -nums[i];
        }
    }
    Arrays.sort(nums);
    if(k % 2 == 1) nums[0] = -nums[0];
    return IntStream.of(nums).sum();
}
  • 将数组根据绝对值大小进行排序, 这样就不用第二次排序了
java 复制代码
public static int largestSumAfterKNegations(int[] nums, int k) {
    nums = IntStream.of(nums).boxed().sorted((a, b) -> Math.abs(b) - Math.abs(a)).mapToInt(Integer::valueOf).toArray();
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] < 0 && k > 0) {
            k--;
            nums[i] = -nums[i];
        }
    }
    if (k % 2 == 1) nums[nums.length - 1] = -nums[nums.length - 1];
    return IntStream.of(nums).sum();
}
相关推荐
ZhengEnCi11 分钟前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
秋天的怀念_David1 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Pniubi1 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_6181 小时前
大模型落地三重优化实战
人工智能·算法·机器学习
云和数据.ChenGuang1 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
apple-mapping2 小时前
网络RTK定位学习总结
学习·网络rtk
2601_970703833 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
心中有你02143 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
楚山之石3 小时前
【Lancet Neurology 】多发性硬化认知障碍的 SDMT 筛查、灰质萎缩标志与认知康复循证路径
图像处理·人工智能·学习·mri
ZhengEnCi4 小时前
同样的模型,为什么本地和云 API 差别那么大:量化精度、聊天模板与采样参数的三大元凶
人工智能·算法·llm