class Solution {
public int maxProfit(int[] prices) {
int maxProfit = 0; // 初始化最大利润为0
// 遍历价格数组,从第一天到倒数第二天
for (int i = 0; i < prices.length - 1; i++) {
// 如果第二天的价格高于当天的价格
if (prices[i + 1] > prices[i]) {
// 将差价加到最大利润中
maxProfit += prices[i + 1] - prices[i];
}
}
// 返回最大利润
return maxProfit;
}
}
用贪心算法来解决。你只需遍历价格数组,如果发现第二天的价格高于当天的价格,就在当天买入,并在第二天卖出。重复这个过程,你将能够获得最大利润,由于只进行了一次遍历,这个算法的时间复杂度是O(n),其中 n 是价格数组的长度。这种贪心的方法是因为可以在同一天买入和卖出股票,所以没有必要跳过任何可能的盈利机会。
以通过使用贪心算法来解决这个问题。从数组的第一个元素开始,每一步都计算可以跳到的最远距离,并和当前位置的下一个位置进行比较。如果最远距离大于或等于数组的长度减一,那么就可以到达最后一个下标
class Solution {
public boolean canJump(int[] nums) {
int maxReach = 0;
for (int i = 0; i < nums.length; i++) {
// 如果当前索引超过了可以到达的最远距离,那么我们不能到达最后一个下标
if (i > maxReach) {
return false;
}
// 更新可以到达的最远距离
maxReach = Math.max(maxReach, i + nums[i]);
// 如果可以到达的最远距离大于或等于数组的长度减一,那么我们可以到达最后一个下标
if (maxReach >= nums.length - 1) {
return true;
}
}
return false;
}
}
class Solution {
public int jump(int[] nums) {
int n = nums.length; // 数组的长度
int maxPos = 0; // 能跳到的最远位置
int end = 0; // 当前这一跳能达到的最远位置
int step = 0; // 跳跃的次数
// 遍历数组,但是不需要遍历最后一个元素,因为当达到或超过最后一个元素时,就不需要再跳跃了
for (int i = 0; i < n - 1; i++) {
// 如果当前位置在能跳到的最远位置范围内
if (maxPos >= i) {
// 更新能跳到的最远位置
maxPos = Math.max(maxPos, i + nums[i]);
// 如果当前位置达到了当前这一跳能达到的最远位置
if (i == end) {
// 更新当前这一跳能达到的最远位置
end = maxPos;
// 跳跃次数加一
step++;
}
}
}
return step; // 返回跳跃次数
}
}
代码的主要逻辑是使用贪心算法,通过不断更新“能够跳到的最远位置”和“当前这一跳能达到的最远位置”来确定最小的跳跃次数。
- maxPos: 在遍历过程中维护的最远可达位置。对于每一个位置i,我们更新
maxPos
为当前位置i和当前位置能跳到的最远位置i + nums[i]
之间的较大值。 - end: 当前这一跳能达到的最远位置。当遍历到此位置时,跳跃次数加一,表示完成了一次完整的跳跃,并且我们需要开始考虑下一次跳跃。
- step: 跳跃的次数,是我们要返回的结果。
此算法的时间复杂度是 O(n),因为我们只需要遍历数组一次。空间复杂度是 O(1),因为我们只使用了几个变量来存储状态。