Day39~738.单调递增的数字、968.监控二叉树

130 阅读4分钟

摘要

本文主要介绍了LeetCode贪心算法的几个题目,其中包括738.单调递增的数字以及968.监控二叉树,并在最后对贪心算法进行了总结。

1、738.单调递增的数字

1.1 思路

  • 从右向左扫描数字,若发现当前数字比其左边一位(较高位)小,则把其左边一位数字减1,并将该位及其右边的所有位改成9

1.2 代码

    public int monotoneIncreasingDigits(int n) {
        String str = String.valueOf(n);
        char[] chars = str.toCharArray();
        int size = chars.length;
​
        int start = size;
        for(int i=size-1; i>0; i--) {
            if(chars[i-1] > chars[i]) {
                chars[i-1]--;
                start = i;
            }
        }
​
        for(int i=start; i<size; i++) {
            chars[i] = '9';
        }
        return Integer.parseInt(String.valueOf(chars));
    }

2、968.监控二叉树 *

3、总结

1、贪心算法的核心思想

贪心算法的核心思想是在每一步都选择当前状态下的最优解,即局部最优解。这些局部最优解在一起构成了整体的最优解。贪心算法不需要进行全局搜索,因为它只关注当前状态下的最佳选择。

2、贪心策略的选择

在每个问题中,选择适当的贪心策略非常重要。根据问题的性质,确定局部最优选择,这要求对问题有深刻的理解。

3、贪心简单题

以下是一些简单的贪心问题,它们通常依赖于常识和直觉。尽管简单,但仍需要找到局部最优解。

  • 分发饼干 (455) :根据孩子的胃口和饼干的大小,最大化满足孩子的数量。
  • K次取反后最大化的数组和 (1005) :将数组中的元素进行最多K次取反操作,以获得最大的数组和。
  • 柠檬水找零 (860) :根据客户的支付,找零时最大程度减少5美元和10美元的数量。

4、贪心中等题

这些中等难度的问题需要更多的思考和分析,贪心策略可能不那么显而易见。

  • 摆动序列 (376) :找到最长的摆动子序列,其中相邻元素之间的差值交替为正和负。
  • 单调递增的数字 (738) :找到小于等于N的最大单调递增数字,其中相邻元素可以重复。

5、贪心解决股票问题

贪心算法在解决股票买卖问题上非常有效,特别是针对多次交易的问题。通过不断买入低价股和卖出高价股,可以最大化利润。

  • 买卖股票的最佳时机 II (122) :多次交易的情况下,最大化利润。

6、区间问题的贪心解决

区间问题,如合并、划分和覆盖区间,经常可以通过贪心算法来解决。根据问题的特点,选择合适的贪心策略。

  • 跳跃游戏 (55) :确定是否能从数组中的起始位置跳到最后一个位置。
  • 跳跃游戏 II (45) :确定跳到最后一个位置所需的最小跳跃次数。
  • 分发糖果 (135) :根据孩子的评分,分发糖果,以满足某些规则。
  • 根据身高重建队列 (406) :根据身高和前面高度较高的人数,重新排列队列。
  • 用最少数量的箭引爆气球 (452) :找出可以用尽可能少的箭引爆所有气球的位置。
  • 无重叠区间 (435) :找出无重叠的区间的最大数量。
  • 划分字母区间 (763) :将字符串划分为尽可能多的不重叠子串。
  • 合并区间 (56) :合并重叠的区间,以获得不重叠的区间。

7、贪心难题

这些问题可能需要更多的练习和深思熟虑。它们既有贪心的特点,又可能涉及其他复杂的问题。

  • 加油站 (134) :找到可以绕行一次的加油站,以确保可以环游整个环。
  • 监控二叉树 (968) :在二叉树上放置监控摄像头,以覆盖每个节点。

参考资料

代码随想录-738.单调递增的数字

代码随想录-968.监控二叉树