算法沉淀——贪心算法六(leetcode真题剖析)

这篇具有很好参考价值的文章主要介绍了算法沉淀——贪心算法六(leetcode真题剖析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

算法沉淀——贪心算法六(leetcode真题剖析),算法沉淀,算法,贪心算法,leetcode

01.坏了的计算器

题目链接:https://leetcode.cn/problems/broken-calculator/

在显示着数字 startValue 的坏计算器上,我们可以执行以下两种操作:

  • **双倍(Double):**将显示屏上的数字乘 2;
  • **递减(Decrement):**将显示屏上的数字减 1

给定两个整数 startValuetarget 。返回显示数字 target 所需的最小操作数。

示例 1:

输入:startValue = 2, target = 3
输出:2
解释:先进行双倍运算,然后再进行递减运算 {2 -> 4 -> 3}.

示例 2:

输入:startValue = 5, target = 8
输出:2
解释:先递减,再双倍 {5 -> 4 -> 8}.

示例 3:

输入:startValue = 3, target = 10
输出:3
解释:先双倍,然后递减,再双倍 {3 -> 6 -> 5 -> 10}.

思路

这里我们采用逆向思维的方式,更容易找到最短的计算次数,即使用目标值进行除法和加法运算逆推。

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

class Solution {
public:
    int brokenCalc(int startValue, int target) {
        int ret=0;
        while(target>startValue){
            if(target%2) target++;
            else target/=2;
            ret++;
        }
        return ret+startValue-target;
    }
};

02.合并区间

题目链接:https://leetcode.cn/problems/merge-intervals/

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。 

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

思路

这里我们要使用贪心思想,首先需要对整体进行排序,通过不断比较更新数组右区间的值,得到最大长度的区间数组。

代码

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end());

        int left=intervals[0][0],right=intervals[0][1];
        vector<vector<int>> ret;
        for(int i=1;i<intervals.size();i++){
            int a=intervals[i][0],b=intervals[i][1];
            if(a<=right) right=max(right,b);
            else{
                ret.push_back({left,right});
                left=a;
                right=b;
            }
        }
        ret.push_back({left,right});
        return ret;
    }
};

03.无重叠区间

题目链接:https://leetcode.cn/problems/non-overlapping-intervals/

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠

示例 1:

输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。

示例 2:

输入: intervals = [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

示例 3:

输入: intervals = [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。 

提示:

  • 1 <= intervals.length <= 105
  • intervals[i].length == 2
  • -5 * 104 <= starti < endi <= 5 * 104

思路

首先我们按左端点排序,当两个区间重叠的时候,为了能保留更多的区间,我们应移除右端点较大的区间,代码的实现类似上一题

代码

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end());
        int ret=0;
        int left=intervals[0][0],right=intervals[0][1];
        for(int i=1;i<intervals.size();i++){
            int a=intervals[i][0],b=intervals[i][1];
            if(a<right){
                ret++;
                right=min(right,b);
            }
            else right=b;
        }
        return ret;
    }
};

04.用最少数量的箭引爆气球

题目链接:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstartxend之间的气球。你不知道气球的确切 y 坐标。

一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 x``startx``end, 且满足 xstart ≤ x ≤ x``end,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。

给你一个数组 points返回引爆所有气球所必须射出的 最小 弓箭数

示例 1:

输入:points = [[10,16],[2,8],[1,6],[7,12]]
输出:2
解释:气球可以用2支箭来爆破:
-在x = 6处射出箭,击破气球[2,8]和[1,6]。
-在x = 11处发射箭,击破气球[10,16]和[7,12]。

示例 2:

输入:points = [[1,2],[3,4],[5,6],[7,8]]
输出:4
解释:每个气球需要射出一支箭,总共需要4支箭。

示例 3:

输入:points = [[1,2],[2,3],[3,4],[4,5]]
输出:2
解释:气球可以用2支箭来爆破:
- 在x = 2处发射箭,击破气球[1,2]和[2,3]。
- 在x = 4处射出箭,击破气球[3,4]和[4,5]。

提示:

  • 1 <= points.length <= 105
  • points[i].length == 2
  • -231 <= xstart < xend <= 231 - 1

思路

按照左端点排序,这样互相重叠的区间都是连续的,这样,我们在射箭的时候,要发挥每一支箭最大的作用,应该把互相重叠的区间统一引爆。因为我们是按左端点排序的,因此对于两个区间,我们求的是他们的交集,左端点为两个区间左端点的最大值,右端点为两个区间的右端点的最小值。

代码

class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        sort(points.begin(),points.end());
        int right=points[0][1];
        int count=1;
        for(int i=1;i<points.size();i++){
            int a=points[i][0],b=points[i][1];
            if(a<=right) right=min(right,b);
            else count++,right=b;
        }
        return count;
    }
};

到了这里,关于算法沉淀——贪心算法六(leetcode真题剖析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 算法沉淀——贪心算法七(leetcode真题剖析)

    题目链接:https://leetcode.cn/problems/integer-replacement/ 给定一个正整数 n ,你可以做如下操作: 如果 n 是偶数,则用 n / 2 替换 n 。 如果 n 是奇数,则可以用 n + 1 或 n - 1 替换 n 。 返回 n 变为 1 所需的 最小替换次数 。 示例 1: 示例 2: 示例 3: 提示: 1 = n = 2^31 - 1 思路 这里我们

    2024年03月23日
    浏览(40)
  • 算法沉淀——栈(leetcode真题剖析)

    栈(Stack)是一种基于先进后出(Last In, First Out,LIFO)原则的数据结构。栈具有两个主要的操作: 压栈(Push) :将元素添加到栈的顶部。 出栈(Pop) :从栈的顶部移除元素。 栈常常用于需要反转操作顺序的场景,或者在需要记录操作历史的情况下。在算法中,栈的应用广

    2024年02月20日
    浏览(31)
  • 算法沉淀——递归(leetcode真题剖析)

    递归是一种通过调用自身的方式来解决问题的算法。在递归算法中,问题被分解为更小的相似子问题,然后通过对这些子问题的解进行组合来解决原始问题。递归算法通常包含两个主要部分: 基本情况(Base Case): 定义问题的最小规模,直接解答而不再进行递归。基本情况

    2024年02月20日
    浏览(33)
  • 算法沉淀——多源 BFS(leetcode真题剖析)

    多源 BFS 是指从多个源点同时进行广度优先搜索的算法。在传统的 BFS 中,我们通常从一个起始点开始,逐层遍历所有的相邻节点。而在多源 BFS 中,我们可以同时从多个源点开始,从这些源点出发,逐层向外扩展,直到达到目标或者遍历完整个图。 多源 BFS 可以用于解决一些

    2024年02月19日
    浏览(35)
  • 算法沉淀——BFS 解决 FloodFill 算法(leetcode真题剖析)

    BFS(广度优先搜索)解决 Flood Fill 算法的基本思想是通过从起始点开始,逐层向外扩展,访问所有与起始点相连且具有相同特性(颜色等)的区域。在 Flood Fill 中,通常是通过修改图像的像素颜色。 下面是 BFS 解决 Flood Fill 算法的步骤: 初始化: 将起始点的颜色修改为新的

    2024年02月20日
    浏览(29)
  • 算法沉淀——优先级队列(堆)(leetcode真题剖析)

    优先队列(Priority Queue)是一种抽象数据类型,它类似于队列(Queue),但是每个元素都有一个关联的优先级。在优先队列中,元素按照优先级从高到低(或从低到高)排列,高优先级的元素先出队。这种数据结构可以用堆(Heap)来实现。 堆是一种二叉树结构,有两种主要类

    2024年02月22日
    浏览(35)
  • 算法沉淀——BFS 解决拓扑排序(leetcode真题剖析)

    Breadth-First Search (BFS) 在拓扑排序中的应用主要是用来解决有向无环图(DAG)的拓扑排序问题。拓扑排序是对有向图中所有节点的一种线性排序,使得对于每一条有向边 (u, v),节点 u 在排序中都出现在节点 v 的前面。如果图中存在环路,则无法进行拓扑排序。 BFS 解决拓扑排序

    2024年02月21日
    浏览(29)
  • 算法沉淀——BFS 解决最短路问题(leetcode真题剖析)

    BFS (广度优先搜索)是解决最短路径问题的一种常见算法。在这种情况下,我们通常使用BFS来查找从一个起始点到目标点的最短路径。 具体步骤如下: 初始化: 从起始点开始,将其放入队列中,并标记为已访问。 BFS遍历: 不断从队列中取出顶点,然后探索与该顶点相邻且

    2024年02月20日
    浏览(32)
  • 算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习一(leetcode真题剖析)

    题目链接:https://leetcode.cn/problems/permutations/ 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 示例 2: 示例 3: 提示: 1 = nums.length = 6 -10 = nums[i] = 10 nums 中的所有整数 互不相同 思路 这是一个典型的回溯问题,需要在每

    2024年02月21日
    浏览(34)
  • 2023华为OD机试真题【区间交叠/贪心算法】【Python Java】

    给定坐标轴上的一组线段,线段的起点和终点均为整数并且长度不小于1,请你从中找到最少数量的线段,这些线段可以覆盖住所有线段。 输入描述 第一行输入为所有线段的数量,不超过10000,后面每行表示一条线段,格式为”x,y”, x和y 分别表示起点和终点,取值范围是

    2024年02月13日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包