【力扣刷题 | 第十七天】

这篇具有很好参考价值的文章主要介绍了【力扣刷题 | 第十七天】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【力扣刷题 | 第十七天】,【力扣刷题】,leetcode,算法,职场和发展

目录

前言:

55. 跳跃游戏 - 力扣(LeetCode)

45. 跳跃游戏 II - 力扣(LeetCode)

总结:


前言:

        今天两道类型都是贪心算法,希望可以有所收获

55. 跳跃游戏 - 力扣(LeetCode)

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

【力扣刷题 | 第十七天】,【力扣刷题】,leetcode,算法,职场和发展

其实这道题注重的是思想,很多人把这道题当作贪心算法思路去做,但是都陷入了一个思维陷阱:

我在当前位置如何选择下一步,使其最后能够到达目的点。

但是如果这样想,就会陷入很难的一个解题思路,就是如何选取下一步怎么走,因为有的时候贪的步数多反而无法到达重点。

因此我们不要纠结于到底应该怎么走,而是看覆盖范围,我用实例给大家举例子:

【力扣刷题 | 第十七天】,【力扣刷题】,leetcode,算法,职场和发展

 我们可以用横线表示覆盖范围:
【力扣刷题 | 第十七天】,【力扣刷题】,leetcode,算法,职场和发展

 可以清楚的看到3已经覆盖了4,那么我们就可以知道在这个数组中,我们是可以走到最后一个点的。

我们再举一个反例:
【力扣刷题 | 第十七天】,【力扣刷题】,leetcode,算法,职场和发展

 我们就可以看到这个数组的元素(不包括最后一个元素)是无法覆盖到最后一个点的,那么无论我们怎么走也不可能到达最后一个点。

因此这道题我们根据这种思想,可以写出解法:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int size =nums.size();
        int cover=0;
        for(int i=0;i<=cover;i++)
        {
           cover=max(nums[i]+i,cover);
            if(cover>=size-1)
            {
                return true;
            }         
        }
        return false;
    }
};

45. 跳跃游戏 II - 力扣(LeetCode)

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

0 <= j <= nums[i] 
i + j < n
返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。

【力扣刷题 | 第十七天】,【力扣刷题】,leetcode,算法,职场和发展

 这道题也是贪心算法思路,但是很多人贪心的目的错了,上道题中我们引入了覆盖范围,那么实际上在最小跳跃次数的前提下我们贪的不是最多的步数,而是最大的覆盖范围。

根据这个解题思想,我们可以得出:

class Solution {
public:
    int jump(vector<int>& nums) {
        int size =nums.size();
        int cur=0;
        int next=0;
        int count=0;
        if(size==1)
        {
            return 0;
        }

        for(int i=0;i<size;i++)
        {
            next=max(i+nums[i],next);
            if(i==cur)
            {
                if(cur!=size-1)
                {
                    count++;
                    cur=next;
                }
                if(cur>=size-1)
                {
                    break;
                }
            }
        }
        return count;
    }
    
};

我来做一下详细的解释:先建立四个变量:size  表示到达目的点所需长度,cur  表示当前所在点的覆盖范围,next  表示我们将要跳到的点的覆盖范围,count  记录跳跃次数。

此后基于当前位置的覆盖范围,我们向后寻找下一个最大的覆盖范围,这也就是for语句里面三个if的作用

  • if(i==cur)用来判断我们的是否已经判断完当前覆盖范围内的下一个最大覆盖范围。
  • if(cur!=size-1)用来判断是否当前覆盖范围未覆盖到目的点,如果不等于就是没覆盖,如果没覆盖,我们就要走到下一个最大覆盖点处(cur=next),并且给跳跃次数+1(count++)
  • if(cur>=size-1)用来判断是否当前覆盖范围已经覆盖到目的点,如果已经覆盖,则说明此时的跳跃步数就已经是最短跳跃步数,直接退出循环,输出结果。

总结:

贪心算法的题目万变不离其宗,我们还是要通过大量的刷题掌握更多的贪心算法思路。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

【力扣刷题 | 第十七天】,【力扣刷题】,leetcode,算法,职场和发展

 文章来源地址https://www.toymoban.com/news/detail-553936.html

 

到了这里,关于【力扣刷题 | 第十七天】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【力扣刷题 | 第十三天】

    今天随机进行练习,题型上不会有什么限制,主要还是练习STL算法。 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并

    2024年02月10日
    浏览(52)
  • leetcode 力扣刷题 旋转矩阵(循环过程边界控制)

    下面的题目的主要考察点都是,二维数组从左上角开始顺时针(或者逆时针)按圈遍历数组的过程。顺时针按圈遍历的过程如下: 对于每一圈,分为四条边 ,循环遍历就好。这时,对于 四个角 的元素的处理,可以将四条边的遍历分为以下两种情况: 第一种:每条边都从对

    2024年02月12日
    浏览(48)
  • 【leetcode 力扣刷题】汇总区间//合并区间//插入区间

    题目链接:228.汇总区间 题目内容: 看题目真是没懂这个题到底是要干啥……实际上题目要求的 恰好覆盖数组中所有数字 的 最小有序 区间范围列表,这个最小是指一个区间范围小。比如能够覆盖{2,3,4,6}的区间可以是[2,6],但是5在区间内,却不在数组内,因此这个区间不是最

    2024年02月10日
    浏览(38)
  • 【leetcode 力扣刷题】移除链表元素 多种解法

    题目链接:203.移除链表元素 题目内容: 理解题意:就是单纯的删除链表中所有值等于给定的val的节点。上一篇博客中介绍了链表的基础操作,在删除链表中节点时,需要注意的是头节点: 如果没有虚拟头节点,那么对头节点的删除需要做不同的处理,head = head-next; 如果有

    2024年02月12日
    浏览(48)
  • 【leetcode 力扣刷题】链表基础知识 基础操作

    在数据结构的学习过程中,我们知道线性表【一种数据组织、在内存中存储的形式】是线性结构的,其中线性表包括顺序表和链表。数组就是顺序表,其各个元素在内存中是连续存储的。 链表则是由 数据域 和 指针域 组成的 结构体 构成的,数据域是一个节点的数据,指针域

    2024年02月12日
    浏览(39)
  • 【leetcode 力扣刷题】回文串相关题目(KMP、动态规划)

    题目链接:5. 最长回文子串 题目内容: 题目就是要我们找s中的回文子串,还要是最长的。其实想想,暴力求解也行……就是遍历所有的子串,同时判断是不是回文串,是的话再和记录的最大长度maxlen比较,如果更长就更新。时间复杂度直接变成O(n^3)。 优化的点在于,假设子

    2024年02月09日
    浏览(48)
  • 【leetcode 力扣刷题】字符串翻转合集(全部反转///部分反转)

    题目链接:344. 反转字符串 题目内容: 题目中重点强调了必须 原地修改 输入数组,即不能新建一个数组来完成字符串的反转。我们注意到: 原来下标为0的,反转后是size - 1【原来下标是size - 1的,反转后是0】; 原来下标是1的,反转后是size - 2【原来下标是size -2的,反转后

    2024年02月11日
    浏览(46)
  • 【leetcode 力扣刷题】字符串匹配之经典的KMP!!!

    以下是能用KMP求解的算法题,KMP是用于字符串匹配的经典算法【至今没学懂………啊啊啊】 题目链接:28. 找出字符串中第一个匹配项的下标 题目内容: 题意还是很好理解的,要在字符串haystack中查找一个完整的needle,即字符串匹配。 暴力求解就是用 两层循环 :haystack从第

    2024年02月09日
    浏览(42)
  • 算法第十七天-构造有效字符串的最少插入数

    考虑abc的个数 假设答案有n个\\\"abc\\\"组成,那么需要插入的字符个数为 3 ∗ n − l e n ( s ) 3*n - len(s) 3 ∗ n − l e n ( s ) 。 对于相邻的两个字符x和y(x在y左侧): 如果 x y xy x y ,那么x和y可以在同一个\\\"abc\\\"内,否则一定不在; 如果 x ≥ y xge y x ≥ y ,那么x和y一定不可以在同一个

    2024年01月17日
    浏览(49)
  • 力扣刷题-动态规划算法3:完全背包问题

    问题描述: 1)有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。 2) 每件物品都有无限个(也就是可以放入背包多次) (比0-1背包多出的条件) 3) 求解将哪些物品装入背包里物品价值总和最大。 求解步骤: 1)首先遍历物品,然

    2023年04月13日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包