前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >56. 合并区间(思维)

56. 合并区间(思维)

作者头像
Ch_Zaqdt
发布2020-02-17 11:13:38
2790
发布2020-02-17 11:13:38
举报
文章被收录于专栏:Zaqdt_ACMZaqdt_ACM

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

       用了各种stl去模拟这个过程,写的太麻烦了,之后看了别人的做法确实要好写一点,但是思路都是差不多的,首先对数组按左端点从小到大排序,然后枚举每个区间,去比较当前区间的右端点的值是否大于等于下一个区间的左端点的值,然后判断并更新区间,然后保存答案。这里合并的过程我用栈去实现的,那么获取答案就还要另外的花费时间去存到vector中,而且栈存的答案是倒叙的,最终反转数组又要花费时间,所以效率不高。还是别人的做法比较可取,直接用临时变量来代替栈顶元素。


AC代码:

代码语言:javascript
复制
class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> ans;
        stack<pair<int, int>> s;
        int len = intervals.size();
        if(len == 0) return ans;
        typedef pair<int, int> p;
        vector<pair<int, int>> v;
        for (int i = 0; i < len; i++) {
            v.push_back(p(intervals[i][0], intervals[i][1]));
        }
        sort(v.begin(), v.end(), [](const pair<int, int> a, const pair<int, int> b) {
            if (a.first == b.first) return a.second < b.second;
            return a.first < b.first;
            });
        s.push(p(v[0].first, v[0].second));
        for (int i = 1; i < len; i++) {
            if (s.top().second >= v[i].first) {
                pair<int, int> tmp = p(min(s.top().first,v[i].first), max(v[i].second, s.top().second));
                s.pop();
                s.push(tmp);
            }
            else {
                pair<int, int> tmp = p(v[i].first, v[i].second);
                s.push(tmp);
            }
        }
        while(s.size() != 0) {
            vector<int> x{ s.top().first, s.top().second };
            ans.push_back(x);
            s.pop();
        }
        reverse(ans.begin(), ans.end());
        return ans;
    }
};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档