第一题:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
局部最优:当天减去前一天的差值为正数,所有的正利润相加;
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result = 0;
for (int i = 1; i < prices.size(); i++) {
if (prices[i] > prices[i-1]) {
result = result + prices[i] - prices[i-1];
}
}
return result;
}
};
第二题:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
只要增加覆盖范围,判断范围是否覆盖了最后一个下标就行,范围cover = i + nums[i](当前下标+可以前进的下标):
class Solution {
public:
bool canJump(vector<int>& nums) {
if (nums.size() == 1) return true;
int cover = 0;
for (int i = 0; i <= cover; i++) {
if (nums[i] + i > cover) {
cover = nums[i] + i;
}
if (cover >= nums.size()-1) return true;
}
return false;
}
};
第三题:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
用最少的步数尽可能扩大覆盖范围,直到范围覆盖到最后一个下标,遍历的时候记录下一个最大的覆盖范围,也就是说当第一个覆盖范围走的时候,下一个覆盖范围已经在更新并且获得最大值了,然后我们需要判断下一个覆盖范围是否覆盖到了最后一个下标,如果没有则继续走第二个覆盖范围,直到增加的覆盖范围覆盖到了最后一个下标:
class Solution {
public:
int jump(vector<int>& nums) {
if (nums.size() <= 1) return 0;
int cur_cover = 0, next_cover = 0;
int result = 0;
//相当于先计算了从0开始的一次跳跃
for (int i = 0; i <= cur_cover; i++) {
next_cover = max(next_cover, nums[i] + i);
if (i == cur_cover) {
result++;
if (next_cover >= nums.size()-1) {
return result; //所以这里不需要再+1
}
cur_cover = next_cover;
}
}
return 0;
}
};