Uriel's Corner

Research Associate @ Harvard University / Research Interests: Computer Vision, Biomedical Image Analysis, Machine Learning
posts - 0, comments - 50, trackbacks - 0, articles - 594

[LeetCode]Merge Intervals-2014.01.20

Posted on 2014-01-20 22:40 Uriel 阅读(197) 评论(0)  编辑 收藏 引用 所属分类: LeetCode
合并区间,算是经典题了吧,所有区间头尾打乱排序(值相同时区间头排前面!),然后用一个变量记录当前有几重重叠区间,从0->1是为一个合并后的新区间的起始,1->0时为一个合并后的新区间的结束,CE若干次,因为不熟C++,cmp函数写在class里面,WA一次,排序没考虑值相同的情况。。

 1 /**
 2  * Definition for an interval.
 3  * struct Interval {
 4  *     int start;
 5  *     int end;
 6  *     Interval() : start(0), end(0) {}
 7  *     Interval(int s, int e) : start(s), end(e) {}
 8  * };
 9  */
10  
11 struct seg {
12     int fg; //0->start
13     int val;
14 };
15 
16 bool cmp(seg a, seg b) {
17     if(a.val != b.val) return a.val < b.val;
18     return a.fg < b.fg;
19 }
20 
21 class Solution {
22 public:
23     seg s[100010];
24     vector<Interval> merge(vector<Interval> &intervals) {
25         int n = 0;
26         vector<Interval> res;
27         Interval tp;
28         if(!intervals.size()) return res;
29         for(int i = 0; i < intervals.size(); ++i) {
30             s[n].val = intervals[i].start;
31             s[n].fg = 0;
32             ++n;
33             s[n].val = intervals[i].end;
34             s[n].fg = 1;
35             ++n;
36         }
37         sort(s, s + n, cmp);
38         int nt = 0;
39         for(int i = 0; i < n; ++i) {
40             if(!s[i].fg) {
41                 nt++;
42                 if(nt == 1) tp.start = s[i].val;
43             }
44             else {
45                 nt--;
46                 if(!nt) {
47                     tp.end = s[i].val;
48                     res.push_back(tp);
49                 }
50             }
51         }
52         return res;
53     }
54 };

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理