//这道题和信封堆叠很类似
//给 n 个信封的长度和宽度。如果信封 a 的长和宽都小于信封 b ,那么信封 a 可以放到信封 b 里,请求出信封最多可以嵌套多少层。
//数据范围: 1 \le n \le 2\times10^31≤n≤2×103 , 1 \le lettersi, lettersi \le 2\times10^31≤lettersi,lettersi≤2×103
/** * struct Interval { * int start; * int end; * Interval(int s, int e) : start(start), end(e) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param Intervals Interval类vector * @param newInterval Interval类 * @return Interval类vector */ //自定义比较器 static bool cmp(Interval &a,Interval &b){ if(a.start==b.start){ return a.end<b.end; } return a.start<b.start; } vector<Interval> insertInterval(vector<Interval>& Intervals, Interval newInterval) { // write code here vector<Interval> res; Intervals.push_back(newInterval); int n=Intervals.size(); sort(Intervals.begin(),Intervals.end(),cmp);//对数据进行排序 int temp=0; int end=Intervals[0].end,first=Intervals[0].start; for(int i=1;i<n;i++){ if(end>=Intervals[i].start){ end=max(end,Intervals[i].end);//贪心策略取最远能达到的地方 }else{ Interval ans; ans.start=first; ans.end=end; res.push_back(ans); int j=res.size();//因为不满足之前if判断,first和end将进行判断从而进入下一个测试区间 if(j>0&&res[j-1].end==end&&res[j-1].start==first){ first=Intervals[i].start; end=Intervals[i].end; continue; } } }//将最后一个区间放入答案中 Interval ans; ans.start=first; ans.end=end; res.push_back(ans); return res; } };