区间问题(贪心)(一)

简介: 复习acwing算法基础课的内容,本篇为讲解基础算法:贪心——区间选点,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。

文章目录

前言

一、贪心

二、例题,代码

AcWing 905. 区间选点

本题分析

AC代码

AcWing 908. 最大不相交区间数量

本题分析

AC代码

AcWing 906. 区间分组

本题分析

AC代码

AcWing 907. 区间覆盖

本题分析

AC代码

三、时间复杂度


前言

复习acwing算法基础课的内容,本篇为讲解基础算法:贪心——区间选点,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。


一、贪心

贪心:利益最大化,即找到最优的情况,贪心问题难在证明,即你可能能推断出这个题目的正确解法,但是这个解法下为什么就是最优解不好证明。


区间问题其实就是区间的左右端点的排序问题


二、例题,代码

AcWing 905. 区间选点

本题链接:AcWing 905. 区间选点

本博客给出本题截图:

image.png

本题分析

把每一段区间按照右端点进行排序,然后开始依次遍历,res代表答案,ed是本区间的右端点,如果存在下一个区间的左端点大于本区间的右端点,那么证明这两个区间内没有交集,就让res ++;,然后把ed更新成下一个区间的右端点.

AC代码

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100010;
struct St
{
    int l, r;
    bool operator < (const St w) const
    {
        return r < w.r;
    }
}st[N];
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ )
    {
        int l, r;
        scanf("%d%d", &l, &r);
        st[i] = {l, r};
    }
    sort(st, st + n);
    int res = 0, ed = -1e9;
    for (int i = 0; i < n; i ++ )
        if (st[i].l > ed) 
        {
            res ++;
            ed = st[i].r;
        }
    printf("%d", res);
    return 0;
}

AcWing 908. 最大不相交区间数量

本题链接:AcWing 908. 最大不相交区间数量

本博客给出本题截图:

image.png

本题分析

本题与上题一致

AC代码

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100010;
struct St
{
    int l, r;
    bool operator < (const St w) const
    {
        return r < w.r;
    }
}st[N];
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ )
    {
        int l, r;
        scanf("%d%d", &l, &r);
        st[i] = {l, r};
    }
    sort(st, st + n);
    int res = 0, ed = -1e9;
    for (int i = 0; i < n; i ++ )
        if (st[i].l > ed) 
        {
            res ++;
            ed = st[i].r;
        }
    printf("%d", res);
    return 0;
}





目录
相关文章
|
8月前
leetcode-435:无重叠区间
leetcode-435:无重叠区间
38 0
|
5月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
47 0
|
8月前
DAY-4 | 力扣 - 求自身以外数组的乘积:区间划分,左右累乘,巧求乘积
该文档是关于LeetCode上的一道题目“Product of Array Except Self”的题解。提供了两种解题方法,一是暴力破解,即计算所有数的乘积后再逐个除以当前元素;二是左右累乘法,通过两次遍历数组分别计算左侧和右侧元素的乘积,避免了除法操作。其中,左右累乘法更优,代码实现中展示了这种方法。
56 1
|
8月前
|
C++
2589. 完成所有任务的最少时间(区间取点——贪心or线段树)
2589. 完成所有任务的最少时间(区间取点——贪心or线段树)
|
8月前
|
人工智能 算法
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
|
8月前
代码随想录Day30 贪心05 LeetCode T435无重叠区间 T763划分字母区间 T56 合并区间
代码随想录Day30 贪心05 LeetCode T435无重叠区间 T763划分字母区间 T56 合并区间
56 0
|
人工智能 算法 BI
贪心算法——区间选点与最大不相交区间数
贪心算法——区间选点与最大不相交区间数
85 0
区间选点(贪心)
这个题,虽然没有写过,但是我盲猜这个题肯定很经典
116 0
|
C++
(排列,选择类dp)(数论同余定理,同余运算)(以背包为母题)1214. 波动数列
(排列,选择类dp)(数论同余定理,同余运算)(以背包为母题)1214. 波动数列
102 0
leetcode-每日一题1403. 非递增顺序的最小子序列(贪心)
时间复杂度:O(n logn) 其中n时数组长度,对数组进行排序需要O(n logn)的时间,对数组进行遍历需要O(n)的时间
104 0
leetcode-每日一题1403. 非递增顺序的最小子序列(贪心)