摘要
本文主要介绍了LeetCode贪心算法的几个题目,包括122.买卖股票的最佳时机 II、55. 跳跃游戏、45.跳跃游戏 II。
1、122.买卖股票的最佳时机 II
1.1 思路
- 局部最优:收集每天正的利润
- 全局最优:求得最大利润
- 贪心算法的关键思想是,只要有利可图,就进行买入和卖出操作,从而累积最大的利润。这种方法适用于多次买卖的情况,因为它允许在同一天卖出并买入。
1.2 代码
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;
}
2、55. 跳跃游戏
2.1 思路
- 局部最优:每次取最大跳跃步数(取最大覆盖范围)
- 整体最优:最后得到整体最大覆盖范围,看是否能到终点
- 这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。
2.2 代码
public boolean canJump(int[] nums) {
int cover = 0;
for(int i=0; i<=cover; i++) {
cover = Math.max(i+nums[i], cover);
if(cover >= nums.length-1) {
return true;
}
}
return false;
}
3、45.跳跃游戏 II
3.1 思路
- 每一步尽可能地用最少的步数去增加我的覆盖范围,一旦我的覆盖范围覆盖到了终点,就把我们的这个步数输出即可
3.2 代码
public int jump(int[] nums) {
if (nums == null || nums.length == 0 || 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(i+nums[i], maxDistance);
// 走到当前覆盖的最大区域时,更新下一步可达的最大区域
if(i == curDistance) {
curDistance = maxDistance;
count++;
}
// 说明当前一步,就到达了末尾
if(curDistance >= nums.length-1) {
break;
}
}
return count;
}