代码随想录 Day32 - 贪心算法(二)
作者:jjn0703
- 2023-07-29 江苏
本文字数:1605 字
阅读完需:约 5 分钟
122. 买卖股票的最佳时机 II
只要有利润,就持续叠加,直到没有利润可得。
package jjn.carl.greedy;
import java.util.Scanner;
/**
* @author Jjn
* @since 2023/7/29 19:58
*/
public class LeetCode122 {
public int maxProfit(int[] prices) {
int max = 0;
for (int i = 1; i < prices.length; i++) {
if (prices[i] >= prices[i - 1]) {
max += prices[i] - prices[i - 1];
}
}
return max;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int count = scanner.nextInt();
int[] prices = new int[count];
for (int i = 0; i < count; i++) {
prices[i] = scanner.nextInt();
}
int maxProfit = new LeetCode122().maxProfit(prices);
System.out.println(maxProfit);
}
}
复制代码
55. 跳跃游戏
package jjn.carl.greedy;
import java.util.Scanner;
/**
* @author Jjn
* @since 2023/7/29 20:07
*/
public class LeetCode55 {
public boolean canJump(int[] nums) {
if (nums.length == 1) {
return true;
}
int coverage = 0;
for (int i = 0; i <= coverage; i++) {
coverage = Math.max(i + nums[i], coverage);
if (coverage >= nums.length - 1) {
return true;
}
}
return false;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int count = scanner.nextInt();
int[] nums = new int[count];
for (int i = 0; i < count; i++) {
nums[i] = scanner.nextInt();
}
boolean canJump = new LeetCode55().canJump(nums);
System.out.println(canJump);
}
}
复制代码
45. 跳跃游戏 II
如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点。故可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新。
如果从这个 起跳点 起跳叫做第 1 次 跳跃,那么从后面 3 个格子起跳 都可以叫做第 2 次 跳跃。
所以,当一次跳跃结束时,从下一个格子开始,到现在 能跳到最远的距离,都是下一次跳跃的起跳点。
对每一次 跳跃 用 for 循环来模拟。
跳完一次之后,更新下一次 起跳点 的范围。
在新的范围内跳,更新 能跳到最远的距离。
记录 跳跃 次数,如果跳到了终点,就得到了结果。
package jjn.carl.greedy;
import java.util.Scanner;
/**
* @author Jjn
* @since 2023/7/29 20:20
*/
public class LeetCode45 {
public int jump(int[] nums) {
int k = 0;
//记录跳跃的次数
int step = 0;
int end = 0;
for (int i = 0; i < nums.length - 1; i++) {
//一定跳得到,因此不存在 k < i
k = Math.max(k, i + nums[i]);
//第一次起跳 或 到达跳跃的边界
if (i == end) {
//再次起跳
step++;
//更新边界
end = k;
}
}
return step;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int total = scanner.nextInt();
int[] nums = new int[total];
for (int i = 0; i < total; i++) {
nums[i] = scanner.nextInt();
}
int jump = new LeetCode45().jump(nums);
System.out.println(jump);
}
}
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 6
jjn0703
关注
Java工程师/终身学习者 2018-03-26 加入
USTC硕士/健身健美爱好者/Java工程师.
评论