代码随想录训练营第三十二天|122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II

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之间的关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值