Leetcode57.Insert_Interval

一个有N个区间的数组,会被分成2N+1份,比较寻找newInterval的start和end分别在哪个区间内,合并中间囊括的所有区间。
注意:下面代码因为枚举类型只设置了BEFORE与CONTAIN两种情况,无法表示newInterval的end在数组最后的情况,需单独编写代码。
时间复杂度:O(N)
C++代码:

class Solution {
	enum pos{BEFORE,CONTAIN};
public:
	vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
		if (intervals.empty())
			return { newInterval };
		if (newInterval.end < intervals[0].start)		//newInterval在所有interval之前
		{
			intervals.insert(intervals.begin(), newInterval);
			return intervals;
		}
		if (newInterval.start > (intervals.end() - 1)->end)	//newInterval在所有interval之后
		{
			intervals.push_back(newInterval);
			return intervals;
		}
		if (newInterval.end > (intervals.end() - 1)->end)		//newInterval的end在所有interval之后
		{
			for (auto it = intervals.begin(); it < intervals.end(); it++)
			{
				if (it->start > newInterval.start)
				{
					int insert_pos = it - intervals.begin();
					intervals.erase(it, intervals.end());
					intervals.insert(intervals.begin()+insert_pos, newInterval);
					return intervals;
				}
				if (it->end >= newInterval.start)
				{
					int insert_pos = it - intervals.begin();
					intervals.erase(it, intervals.end());
					intervals.insert(intervals.begin() + insert_pos, Interval(it->start, newInterval.end));
					return intervals;
				}
			}
		}
		pos start_pos, end_pos;
		vector<Interval>::iterator start_it, end_it;
		for (auto it = intervals.begin(); it < intervals.end(); it++)
		{
			if (it->start > newInterval.start)
			{
				start_it = it;
				start_pos = BEFORE;
				break;
			}
			if (it->end >= newInterval.start)
			{
				start_it = it;
				start_pos = CONTAIN;
				break;
			}
		}
		for (auto it = start_it; it < intervals.end(); it++)
		{
			if (newInterval.end < it->start)
			{
				end_it = it;
				end_pos = BEFORE;
				break;
			}
			if(newInterval.end <= it->end)
			{
				end_it = it;
				end_pos = CONTAIN;
				break;
			}
		}
		if (start_pos == BEFORE && end_pos == BEFORE)
		{
			int insert_pos = start_it - intervals.begin();
			intervals.erase(start_it, end_it);
			intervals.insert(intervals.begin() + insert_pos, newInterval);
		}
		else if (start_pos == CONTAIN && end_pos == CONTAIN)
		{
			Interval temp(start_it->start, end_it->end);
			int insert_pos = start_it - intervals.begin();
			intervals.erase(start_it, end_it + 1);
			intervals.insert(intervals.begin() + insert_pos, temp);
		}
		else if (start_pos == BEFORE && end_pos == CONTAIN)
		{
			Interval temp(newInterval.start, end_it->end);
			int insert_pos = start_it - intervals.begin();
			intervals.erase(start_it, end_it + 1);
			intervals.insert(intervals.begin() + insert_pos, temp);
		}
		else if (start_pos == CONTAIN && end_pos == BEFORE)
		{
			Interval temp(start_it->start, newInterval.end);
			int insert_pos = start_it - intervals.begin();
			intervals.erase(start_it, end_it);
			intervals.insert(intervals.begin() + insert_pos, temp);
		}
		return intervals;
	}
};

猜你喜欢

转载自blog.csdn.net/qq_42263831/article/details/82857544
今日推荐