摘要
本文主要介绍了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) :在二叉树上放置监控摄像头,以覆盖每个节点。