代码随想录训练营第32天|122.买卖股票的最佳时机II,55. 跳跃游戏,45.跳跃游戏II
)
122.买卖股票的最佳时机II
文章
思路
双指针,左侧买入,右侧卖出,右侧移动到价格极高点,左侧移动到价格极低点,完成一次买入卖出后,从right右侧一位重新开始
代码
class Solution {
public int maxProfit(int[] prices) {
int i, n, sum, left, right;
n = prices.length;
sum = 0;
left = 0;
right = 0;
while (right < n) {
while (right < n - 1 && prices[right] <= prices[right + 1]) {
++right;
}
while (left < right && prices[left] >= prices[left + 1]) {
++left;
}
sum += prices[right] - prices[left];
++right;
left = right;
}
return sum;
}
}
55.跳跃游戏
文章
思路
当前位置有一个下一跳范围
从这个范围里找一个能到达最远的位置作下一跳
跳到该位置并更新状态
直到无法选出下一跳,如果过程中发现 n-1 在某个点的下一跳范围内则返回TRUE,否则循环结束后返回false
class Solution {
public boolean canJump(int[] nums) {
int i, span, n;
n = nums.length;
i = 0;
span = i;
while (i <= span) {
span = span > i + nums[i] ? span : i + nums[i];
if (span >= n - 1) {
return true;
}
++i;
}
return false;
}
}
45.跳跃游戏II
文章
思路
跟上题思路差不多,每跳一次记一次数,但是最后一跳要单独计数
代码
class Solution {
public int jump(int[] nums) {
int i, j, n, res, span, next_i, far;
res = 0;
n = nums.length;
i = 0;
while (i < n - 1) {
span = nums[i];
far = i + span;
if (far >= n - 1) {
++res;
break;
}
next_i = i + 1;
for (j = 1; j <= span && i + j < n; ++j) {
if (far < i + j + nums[i + j]) {
far = i + j + nums[i + j];
next_i = i + j;
}
}
i = next_i;
++res;
}
return res;
}
}
总结
今天的题目全部是二刷的
但是比一刷更不顺利,我也不知道怎么回事