122.买卖股票的最佳时机II
题目链接/文章讲解/视频讲解:代码随想录
1.代码展示
//122.买卖股票的最佳时机
int maxProfit(vector<int>& prices) {
int result = 0;
//只购买相邻两天有利润的
for (int i = 1; i < prices.size(); i++) {
result += max(0, prices[i] - prices[i - 1]);
}
return result;
}
2.本题小节
思考:这题思路很巧妙,画图可以知道,最大的利润应该是只卖有利润的两天,最后累计起来就是最大利润,这样巧妙地避开了股票跌的时候。
基本思路:对prices进行遍历,从1开始(此时才能计算利润),只买有利润的即可。
55. 跳跃游戏
题目链接/文章讲解/视频讲解:代码随想录
1.代码展现
//55.跳跃游戏
bool canJump(vector<int>& nums) {
//自己的思路
//数组个数较小于2的情况
if (nums.size() <= 1) {
return true;
}
//数组
//数组个数大1的情况
int cover = 0;
for (int i = 0; i < nums.size() - 1; i++) {
//碰到0的处理方式,判断是否能够越过
if (nums[i] == 0 && cover <= i) {
return false;
}
//统计覆盖范围
cover = max(cover, i + nums[i]);
//判断能否达到最后的范围
if (cover >= nums.size() - 1) {
return true;
}
}
return false;
//卡哥思路
int cover = 0;
if (nums.size() <= 1) {
return true;
}
for (int i = 0; i <= cover; i++) {
cover = max(cover, i + nums[i]);
if (cover >= nums.size() - 1) {
return true;
}
}
return false;
}
2.本题小节
思考:这个我自己也写了一版,但是感觉思路还是拼凑起来的,通过debug才补充完整,卡哥的思路比较明确,遍历cover中覆盖的元素更新cover,来判断最后能不能达到重点。
基本思路:对nums进行遍历,更新cover,直到达到数组尾部。
45.跳跃游戏II
题目链接/文章讲解/视频讲解: 代码随想录
1.代码展示
//45.跳跃游戏Ⅱ
int jump(vector<int>& nums) {
int curCover = 0;
int nextCover = 0;
int step = 0;
//size为1,不需要跳跃
if (nums.size() == 1) return 0;
for (int i = 0; i < nums.size(); i++) {
//更新nextCover
nextCover = max(nextCover, nums[i] + i);
//本题未说清楚,curCover完全有可能超过数组长度
//但是从卡哥代码来看,不存在这种情况
if (curCover == i) {
//未到达数组尾部
//if (curCover != nums.size() - 1) {
step++;
curCover = nextCover;
//更新后是否满足条件
if (curCover >= nums.size() - 1) break;
//}
到达数组尾部
//else {
// break;
//}
}
}
return step;
}
2.本题小节
思考:本题让我有个疑问的地方,也是我觉得本题没有说清楚的地方,到底curCover会不会直接大于nums.size() - 1,通过卡哥的程序来看,是不会的,顶多是等于,如果是大于的话,哦哦哦哦哦!!知道了,curCover是可能直接大于nums.size() - 1的,此时step为1,等遍历完毕后,直接返回即可,这么说是有优化的空间的,把这个判断放在for循环外面即可,刚刚试了一下,也是可以的,但是速度提升幅度很小,刚刚又想了一下,还是不可以,毕竟for循环里面的话也可能出现curCover大于nums.size() - 1的情况,但是根据代码又不会出现这种情况。
本题核心就是有两个cover范围,一个是nextCover,一个是curCover,nextCover是根据curCover来的,本题最开始curCover为0,即只覆盖了i = 0 的情况,nextCover是不断更新的,由于这里curCover不会大于nums.size() - 1,因此在判断i == curCover后,表示此时已经遍历数组到curCover的最后位置了,因此进入判断是否进行下次遍历,情况一是curCover == nums.size() - 1,此时到达尾部了,因此不用再遍历,直接返回step,如果没有达到,更新step++,更新curCover后,再次判断,如果到达了,则返回step,没到达,则开始更新curCover后的遍历。
基本思路:把握好curCover和nextCover的关系,明确curCover与i之间的关系。