【细节实现题】LeetCode 56. Merge Intervals

本文介绍了解决LeetCode第56题“合并区间”的两种方法。第一种方法使用优先队列对区间进行排序,然后遍历并合并重叠区间;第二种方法则直接对区间起始点排序后进行合并。

LeetCode 56. Merge Intervals

Solution1:我的答案

这道题思路不难,有个坑爹的地方在于输入的区间向量未必是有序的,所以利用优先队列priority_queue来排序

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
struct cmp {//学习定义priority_queue的比较函数
    bool operator () (Interval &a, Interval &b) {
        return a.start > b.start;
    }
};
class Solution { // O(n)
public:
    vector<Interval> merge(vector<Interval>& intervals) {
        if (!intervals.size()) return {};
        priority_queue<Interval, vector<Interval>, cmp> q(intervals.begin(), intervals.end());
        vector<Interval> new_intervals;
        while (!q.empty()) { //注意优先队列不能用迭代器
            new_intervals.push_back(q.top());
            q.pop();
        }   
        vector<Interval> res;
        res.push_back(new_intervals[0]);
        for (int i = 1;  i < new_intervals.size(); i++) {
            if (res.back().end < new_intervals[i].start) {
                res.push_back(new_intervals[i]);                  
            } else {
                res.back().start = min(res.back().start, new_intervals[i].start);
                res.back().end = max(res.back().end, new_intervals[i].end);
            }
        }
        return res;
    }
};

priority_queue用法

官网链接:http://www.cplusplus.com/reference/queue/priority_queue/?kw=priority_queue
自定义比较函数连接:https://blog.youkuaiyun.com/Allenlzcoder/article/details/80885979
注意:priority_queue没有迭代器
常用的函数有
empty(): Test whether container is empty (public member function )
size(): Return size (public member function )
top(): Access top element (public member function )
push(): Insert element (public member function )
emplace(): Construct and insert element (public member function )
pop(): Remove top element (public member function )
swap(): Swap contents (public member function )

Solution2:参考答案

链接:http://www.cnblogs.com/grandyang/p/4370601.html

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
bool cmp (Interval &a, Interval &b) {
    return a.start < b.start;
}
class Solution {
public:
    vector<Interval> merge(vector<Interval>& intervals) {
        if (intervals.empty()) return {};
        //关于sort()函数自定义比较函数还是得学习一个!
        sort(intervals.begin(), intervals.end(), cmp);
        vector<Interval> res{intervals[0]};
        for (int i = 1; i < intervals.size(); ++i) {
            if (res.back().end < intervals[i].start) {
                res.push_back(intervals[i]);
            } else {
                res.back().end = max(res.back().end, intervals[i].end);
            }
        }   
        return res;
    }
};

关于sort()的自定义比较函数,参考网址:https://blog.youkuaiyun.com/pmt123456/article/details/61191348
写在类内时,要加上static,lexicographical_compare 最后要求的是一个普通函数指针,而不是成员函数指针,所以要加static。
都忘了,是时候好好复习一下了~~~

提供了基于BP(Back Propagation)神经网络结合PID(比例-积分-微分)控制策略的Simulink仿真模型。该模型旨在实现对杨艺所著论文《基于S函数的BP神经网络PID控制器及Simulink仿真》中的理论进行实践验证。在Matlab 2016b环境下开发,经过测试,确保能够正常运行,适合学习和研究神经网络在控制系统中的应用。 特点 集成BP神经网络:模型中集成了BP神经网络用于提升PID控制器的性能,使之能更好地适应复杂控制环境。 PID控制优化:利用神经网络的自学习能力,对传统的PID控制算法进行了智能调整,提高控制精度和稳定性。 S函数应用:展示了如何在Simulink中通过S函数嵌入MATLAB代码,实现BP神经网络的定制化逻辑。 兼容性说明:虽然开发于Matlab 2016b,但理论上兼容后续版本,可能会需要调整少量配置以适配不同版本的Matlab。 使用指南 环境要求:确保你的电脑上安装有Matlab 2016b或更高版本。 模型加载: 下载本仓库到本地。 在Matlab中打开.slx文件。 运行仿真: 调整模型参数前,请先熟悉各模块功能和输入输出设置。 运行整个模型,观察控制效果。 参数调整: 用户可以自由调节神经网络的层数、节点数以及PID控制器的参数,探索不同的控制性能。 学习和修改: 通过阅读模型中的注释和查阅相关文献,加深对BP神经网络与PID控制结合的理解。 如需修改S函数内的MATLAB代码,建议有一定的MATLAB编程基础。
### LeetCode 56 目解析 LeetCode56要求解决区间合并的问。给定一系列不重叠的区间,在这些区间中插入一个新的区间并进行合并,如果有必要的话[^1]。 ### 解决方案概述 为了有效地处理这个问,可以先按照区间的起始位置对输入数组进行排序。接着遍历这个有序列表来判断当前区间是否与下一个区间有交集;如果有,则将这两个区间合并成一个更大的新区间继续比较下去直到完成整个过程[^2]。 ### C语言实现代码 下面是针对此问的一个具体C语言解决方案: ```c #include <stdio.h> #include <stdlib.h> // 定义结构体表示区间 struct Interval { int start; int end; }; // 比较函数用于qsort()按start升序排列 int compare(const void* a, const void* b) { struct Interval *ia = (struct Interval *)a; struct Interval *ib = (struct Interval *)b; return ia->start - ib->start; } /** * Note: The returned array must be malloced, assume caller calls free(). */ struct Interval* merge(struct Interval* intervals, int intervalsSize, int* returnSize){ qsort(intervals, intervalsSize, sizeof(struct Interval), compare); // 动态分配内存存储结果 struct Interval *result = (struct Interval*)malloc(sizeof(struct Interval)*intervalsSize); *returnSize = 0; for (int i = 0; i < intervalsSize; ++i) { int L = intervals[i].start, R = intervals[i].end; if (!(*returnSize) || result[*returnSize-1].end < L) { result[(*returnSize)++] = intervals[i]; } else { result[*returnSize-1].end = fmax(result[*returnSize-1].end, R); } } return result; } ``` 该算法的时间复杂度主要取决于排序操作O(nlogn),其中n代表输入区间的数量。空间复杂度为O(1)(忽略返回的结果所占用的空间)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值