NC37 合并区间 这个为什么不能通过???
合并区间
https://www.nowcoder.com/practice/69f4e5b7ad284a478777cb2a17fb5e6a?tpId=117&&tqId=34958&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking
实在想不明白,为什么下面解法不能通过。卡在一个很长的看不出全部内容的用例,预期输出显示出来的部分和我的实际输出看起来一样。
我是想把区间先在数组内标记上,标记好合并区间后的结果,再转换成区间格式。标记前先用map按区间左边界排序,过程中发现当前值已经被标记,就按旧标记标记。
/**
* struct Interval {
* int start;
* int end;
* Interval(int s, int e) : start(start), end(e) {}
* };
*/
#include <cstring>
#include <map>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param intervals Interval类vector
* @return Interval类vector
*/
char array[200004] = {0};
void mark_array(pair<int,int>itv, int mark)
{
int my_mark = mark;
if(array[itv.first] != 0)
{
my_mark = array[itv.first];
}
for(int i = 0; i + itv.first <= itv.second; ++i)
{
array[itv.first + i] = my_mark;
}
}
vector<Interval> merge(vector<Interval>& intervals) {
multimap<int,int> list;
for(auto i = intervals.begin(); i != intervals.end(); ++i)
{
pair<int,int> tmp;
tmp.first = i->start;
tmp.second = i->end;
list.insert(tmp);
}
int mark = 0;
for(auto i = list.begin(); i != list.end(); ++i)
{
++mark;
mark_array(*i, mark);
}
//for(int i = 0; i <= 200000; ++i)
//{
//printf("%d,",array[i]);
//}
vector<Interval> ans;
Interval ans1;
int first = 0;
for(int i = 0; i <= 200000; ++i)
{
if(first != 0 && array[i] == 0)
{
//一定是一个区间的结束
ans1.end = i - 1;
ans.push_back(ans1);
first = 0;
}
if(array[i] != 0 && array[i] != first)
{
if(first != 0)
{
ans1.end = i - 1;
ans.push_back(ans1);
}
//当前肯定是一个区间的开始
ans1.start = i;
first = array[i];
}
}
if(first != 0)
{
ans1.end = 200000;
ans.push_back(ans1);
}
return ans;
}
};

