力扣55 跳跃游戏(I,II)

思路

        贪心算法,由于可以跳的步数是一个范围,所以下一步能选的落点也是一个范围,所以我们用覆盖范围(从起点开始,可以到达的范围)来代替落点这一概念。

        此问题转化为,从起点开始,覆盖范围>=终点距离(数组长度-1)

实现方法

                从起点出发,对于每一个覆盖范围内的元素,都从该元素出发,更新最大覆盖范围。

                所以算法实现可以概括为

    从起点出发——>1.对当前节点更新范围——>2遍历到当前范围的末端(此过程中更新了基于当前范围的下一跳最大范围)——>3更新指针最大移动范围。

        ps:对于后续衍生跳跃游戏II(达到目标位置最小步数)来说:每一次更新最大移动范围时,步数++,所以在2的时候检测就好了。

代码

跳跃游戏

        

  1. bool canJump(vector<int>& nums) {
  2. // 贪心算法,步数为当前节点向外最远延伸距离,然后对后续的延伸距离,继续看它们能延伸多远
  3. int maxsize = nums[0];
  4. int recsize = 0;
  5. int x = 0;
  6. if (nums.size() < 2) {
  7. return true;
  8. }
  9. for (; x < maxsize && x < nums.size(); x++) {
  10. recsize = x + nums[x] + 1;
  11. // 这里移动距离得+1,因为上面的判断里是用的数组下标判断的,相当于在这一行再-1,也就是-2了,所以不对
  12. if (recsize > maxsize) {
  13. maxsize = recsize;
  14. }
  15. }
  16. if (maxsize >= nums.size()) {
  17. return true;
  18. } else {
  19. return false;
  20. }
  21. }

跳跃游戏II

  1. int jump(vector<int>& nums) {
  2. if(nums.size()==1){return 0;}//不用跳,头就是尾。
  3. int recentsize = 0; // 基于当前元素的最大能达到的下标
  4. int maxsize = nums[0]; // 最大能达到的下标
  5. int step = 0;
  6. for (int x = 0; x<nums.size()&&x <= maxsize; x++) { // 修改循环条件
  7. recentsize = max(recentsize, x + nums[x]); // 更新recentsize
  8. if (x == maxsize&&x!=0) { // 修改比较运算符
  9. step++;
  10. maxsize = recentsize; // 更新maxsize
  11. }
  12. if (maxsize+1>=nums.size()){step++;break;}
  13. }
  14. return step;
  15. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

举报

选择你想要举报的内容(必选)
  • 内容涉黄
  • 政治相关
  • 内容抄袭
  • 涉嫌广告
  • 内容侵权
  • 侮辱谩骂
  • 样式问题
  • 其他
点击体验
DeepSeekR1满血版
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回顶部

登录后您可以享受以下权益:

×