最近我正在interviewbit.com-https://www.interviewbit.com/problems/merge-intervals/上解决此问题。
我使用向量并在向量上执行操作解决了问题
这是我的代码:
vector<Interval> Solution::insert(vector<Interval> &intervals, Interval newInterval)
{
int n=intervals.size(),leftfound=0,rightfound=0,count=0;
if(n==0) //for the case when intervals vector is empty
{
intervals.push_back(newInterval);
return intervals;
}
int t=0;
if(newInterval.end<newInterval.start) //if(start>end) swap
{
t=newInterval.start;
newInterval.start=newInterval.end;
newInterval.end=t;
}
if(newInterval.start>intervals[n-1].end) //if the newInterval succedes every other
{
intervals.insert(intervals.end(),newInterval);
return intervals;
}
if(newInterval.end<intervals[0].start)//if the newInterval precedes every other element
{
intervals.insert(intervals.begin(),newInterval);
return intervals;
}
auto left=intervals.begin(),right=intervals.begin(); //just initialising with something
auto it=intervals.begin() ; // iterator for loops
while((*it).start<newInterval.start&&it!=intervals.end()) //*it is dereferencing the iterator to
it++; //get the element of vector "intervals" at that index
it--; // decrementing it to reach the desired interval
if((*it).start<=newInterval.start&&(*it).end>=newInterval.start)
{
leftfound=1;left=it;
}
else
left=it+1;
it=left;
while((*it).end<newInterval.end&&it!=intervals.end())
it++;
if((*it).start<=newInterval.end&&(*it).end>=newInterval.end)
{
rightfound=1; right=it;
}
else
right=it-1;
if(right-left==-1&&leftfound==0&&rightfound==0)// this if will be true in cases like:
intervals.insert(left,newInterval); //intervals=[(1,2),(8,10)] and newInterval=(4,6)
else //in every other case this else will execute
{
if(leftfound==0)
(*left).start=newInterval.start;
if(rightfound==0)
(*left).end=newInterval.end;
else (*left).end=(*right).end;
}
left=left+1;
intervals.erase(left,right+1);
return intervals;
}
theviewbit.com平台(IDE)仅需要完成问题中提到的功能。
注意:您只需要实现给定的功能。不要读取输入,而是使用函数的参数。不打印输出,而是返回指定的值。还有疑问吗?检出示例代码以了解更多详细信息。
我需要实现这一点:
vector<Interval> Solution::insert(vector<Interval> &intervals, Interval newInterval) { }
也将间隔结构定义为:
struct Interval {
int start;
int end;
Interval() : start(0), end(0) {}
Interval(int s, int e) : start(s), end(e) {}
};
现在,当使用站点上的测试按钮进行测试时,此解决方案运行良好。之后,当我按提交时,它将显示以下错误:click to see error。当我使用自定义输入运行相同的测试用例(遇到错误)时,代码运行良好并给出了预期的输出。我似乎找不到问题所在。我怀疑这可能是由于擦除功能所致,因为在错误中它显示free()
,但我什至无法肯定。
而且,我在ideone.com上运行了代码,并在代码中添加了结构和主函数,它运行得非常好。
intervals.insert(left,newInterval);
std::vector::insert
使向量的所有现有迭代器无效。之后立即:
left=left+1;
intervals.erase(left,right+1);
到同一向量的left
和right
迭代器在这一点上不再有效,并且使用它们是未定义的行为。
这可能是也可能不是所示代码中的唯一错误。缩进的缩进使得所显示的代码难以阅读和遵循;但这是显示的代码中的确定错误,这很可能是未定义行为和崩溃的原因。