LeetCode 122 买卖股票的最佳时机II
题目链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode)
【解题思路】
利润=当天成交价-昨天成交价
当遇到利润为正数的情况,将其收集。
【解题步骤】
-
1.定义一个result,将每天的正利润累加
-
2.循环遍历数组(注意!i从1开始,因为需要从第二天开始减去第一天的价格才能得出利润):
-
如果当天利润为正数,累加到result数组里
-
-
4.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 跳跃游戏
【解题思路】
不要纠结于能往后跳多少步,只思考当前位置的覆盖范围,只要在覆盖范围内的元素我们在当前位置都能跳到。
如果范围内的元素包含最后一个元素,则返回true,否则返回false。
【解题步骤】
-
1.定义一个cover,用来确认覆盖范围
-
2.如果数组里就一个元素,那么就一定可以跳跃到的,return true
-
4.循环遍历数组(i的终止条件是小于等于cover,因为我们只能在覆盖范围内移动)
-
在已有的覆盖范围内取最大的覆盖范围+赋值给cover
-
如果覆盖范围覆盖到终点,则return true
-
-
5.如果遍历结束还没走到true,就return false
【代码部分】
class Solution {
public boolean canJump(int[] nums) {
int cover =0;
if(nums.length == 1)return true;
for(int i = 0; i <= cover ; i++){
cover = Math.max(nums[i] + i,cover);
if(cover>=nums.length- 1)return true;
}
return false;
}
}
LeetCode 45 跳跃游戏II
题目链接:45. 跳跃游戏 II - 力扣(LeetCode)
【解题思路】
原理同上,不过每一步我们需要尽可能的增加我们的覆盖范围
【解题步骤】
-
1.定义一个cover,用来确认覆盖范围
-
2.定义一个next,用来确认下一步的覆盖范围
-
3.定义一个result记录我们一共跳了几步
-
3.遍历数组:
-
用next记录这一步走完后下一步的覆盖范围(只记录在当前覆盖范围内覆盖范围最大的元素)
-
如果i走到了当前覆盖的终点,并且当前终点不是数组的终点位置:
-
需要启动下一步的覆盖范围,result++
-
将next赋给cover,启动下一步
-
如果当前的覆盖范围已经覆盖到终点,立刻break
-
-
如果当前覆盖范围已经到达了终点,立即break
-
-
4.return result
【代码部分】
class Solution {
public int jump(int[] nums) {
if(nums == null || nums.length == 0 || nums.length == 1){
return 0;
}
int result = 0;
int cover = 0;
int next = 0;
for(int i = 0; i < nums.length ; i++){
next = Math.max(nums[i]+i,next);
if(i == cover){
if(i < nums.length - 1){
result ++;
cover = next;
if(cover >= nums.length - 1){
break;
}
}else{
break;
}
}
}
return result;
}
}