#LeetCode 122. Best Time to Buy and Sell Stock II
#LeetCode 122. 视频讲解:贪心算法也能解决股票问题!LeetCode:122.买卖股票最佳时机II_哔哩哔哩_bilibili
局部最优的区间是第二天价格比第一天价格高的情况,全局最优的区间是将所有的正收入天数累加。
代码:
class Solution {
public int maxProfit(int[] prices) {
int diff = 0;
int result = 0;
for (int i = 1; i < prices.length; i++) {
diff = prices[i] - prices[i - 1];
if (diff > 0) {
result += diff;
}
else {
diff = 0;
}
}
return result;
}
}
优化代码:
class Solution {
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;
}
}
#LeetCode 55. Jump Game
#LeetCode 55. 视频讲解:贪心算法,怎么跳跃不重要,关键在覆盖范围 | LeetCode:55.跳跃游戏_哔哩哔哩_bilibili
题目主要找是否能覆盖整个数组,局部最优:取最大的覆盖范围,全局最优是整体最大覆盖范围,看是否能到终点。所以使用cover 来表示覆盖的范围,如果cover 已经包含了数组中的最后一个元素,则表明可以跳跃到最后的元素,则返回true。
代码:
class Solution {
public boolean canJump(int[] nums) {
if (nums.length == 1) {
return true;
}
int cover = 0;
for (int i = 0; i <= cover; i++) {
if (i + nums[i] < nums.length) {
cover = Math.max(i + nums[i], cover);
if (cover == nums.length - 1) {
return true;
}
}
else {
return true;
}
}
return false;
}
}
另一种更精简的代码:
class Solution {
public boolean canJump(int[] nums) {
if (nums.length == 1) {
return true;
}
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;
}
}
#LeetCode 45. Jump Game II
#LeetCode 45. 视频讲解:贪心算法,最少跳几步还得看覆盖范围 | LeetCode: 45.跳跃游戏II_哔哩哔哩_bilibili
本题与上题的不同在于,需要考虑尽可能少的步。所以需要两个变量来表示覆盖范围,分别为:当前覆盖的范围以及下一步的覆盖范围。这个题目中的局部最优是当前可移动距离尽可能覆盖大的范围,整体最优是一步尽可能多走,目的是达到最少步数。判断条件1 :下一步的覆盖范围可以到达数组的末端,判断条件2 :当前的覆盖区域已经遍历完,但是没有到达数组的末端,此时选择遍历过的数组中最大的覆盖面积(为了达到最少的步数),之后继续遍历。
代码:
class Solution {
public int jump(int[] nums) {
if (nums == null || nums.length == 0 || nums.length == 1) {
return 0;
}
int result = 0;
int curCover = 0, nextCover = 0;
for (int i = 0; i < nums.length; i++) {
nextCover = Math.max(i + nums[i], nextCover);
if (nextCover >= nums.length - 1) {
result ++;
return result;
}
if (i == curCover) {
result ++;
curCover = nextCover;
}
}
return result;
}
}