当前位置: 首页 > news >正文

LeetCode -- Insert Interval

题目描述:




Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).


You may assume that the intervals were initially sorted according to their start times.


Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].


Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].


This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].




本题要求,对于一个已排序好的间隔序列,插入一个新的间隔,需要保证已排序,并且合并overlap的间隔。




本题的复杂度在于情况数间隔的起始和结束位置的判断,需要分情况讨论。


思路:
1. 首先判断新间隔i的end是否比intervals[0].start小,如果是:插入在第一个。
2. 判断i.start是否比intervals.[Count].end 大,如果是:放最后
3. 遍历Intervals,对于start:
a.gap:start 位于intervals[i].end和intervals[i+1].start之间,startIndex = i
b.between:start 位于intervals[i].start,和intervals[i].end之间, startIndex = i-1;
c.start比intervals[0].start小,startIndex=-1
d.确定startIndex (之后用于确定是否添加到result中)


确定start的情况后,起1个内循环j∈[i,Count)找到end符合的情况:
a.gap: end 位于intervals[i].end和intervals[i+1].start之间 endIndex = j + 1
b.start 位于intervals[i].start,和intervals[i].end之间, endIndex = j+1
c.end比intervals[Count].end大, endIndex = Count+1
d.确定endIndex


4.1 : 将[0,startIndex]间的间隔添加到集合
4.2 : 将combine后的interval,添加到集合。
4.3 : 将[endIndex,Count)间的间隔添加到集合中




实现代码:



/**
 * Definition for an interval.
 * public class Interval {
 *     public int start;
 *     public int end;
 *     public Interval() { start = 0; end = 0; }
 *     public Interval(int s, int e) { start = s; end = e; }
 * }
 */
public class Solution {
    public IList<Interval> Insert(IList<Interval> intervals, Interval newInterval) {
    // intervals is empty , return new interval    
    if(intervals.Count == 0){
		return new List<Interval>(){newInterval};
	}
	
	var result = new List<Interval>();
	if(newInterval.end < intervals[0].start){
		result.Add(newInterval);
		result.AddRange(intervals);
		return result;
	}
	
	if(newInterval.start > intervals[intervals.Count-1].end){
		result.AddRange(intervals);
		result.Add(newInterval);
		return result;
	}
	
	
	var newAsStart = false;
	if(newInterval.start < intervals[0].start){
		newAsStart = true;
	}
	
	for(var i = 0;i < intervals.Count; i++){
		var startInBetween = newInterval.start >= intervals[i].start && newInterval.start <= intervals[i].end;
		var startInGap = i < intervals.Count - 1 && newInterval.start > intervals[i].end && newInterval.start < intervals[i+1].start;
		
		//try find start fall into which interval or into which gap
		if(newAsStart || startInBetween || startInGap){
			var j = i ;
			// try find end
			var endIndex = -1;
			var endInBetween = false;
			var endInGap = false;
			var endAtLast = newInterval.end > intervals[intervals.Count-1].end;
			if(!endAtLast){
				while(j < intervals.Count){
					if(newInterval.end >= intervals[j].start && newInterval.end <= intervals[j].end){
						endInBetween = true;
						endIndex = j;
						break;
					}
					else if(j < intervals.Count - 1 && newInterval.end > intervals[j].end && newInterval.end < intervals[j+1].start){
						endInGap = true;
						endIndex = j;
						break;
					}
					j++;
				}
			}
			
			Interval combined = null;
			int start = -1;
			int startIndex = -1;
			if(newAsStart){
				startIndex = -1;
				start = newInterval.start ;
			}
			else if(startInBetween){
				startIndex = i - 1;
				start = intervals[i].start;
			}
			else if(startInGap){
				startIndex = i;
				start = newInterval.start;
			}
			
			int end = -1;
			int endAt = -1;
			//found end
			if(endIndex != -1){
				if(endInBetween){
					end = intervals[endIndex].end;
					endAt = endIndex + 1;
				}
				else if(endInGap){
					end = newInterval.end;
					endAt = endIndex + 1;
				}
				
			}
			else if(endAtLast)
			{
				end = newInterval.end;
				endAt = intervals.Count+1;
			}
			// not found end , means new interval end is bigger than the last end 
			else{
				combined = new Interval(start, newInterval.end);
				endAt = intervals.Count+1;
			}
		
			combined = new Interval(start,end);
			
			for(var x = 0;x <= startIndex; x++){
				result.Add(intervals[x]);
			}
			
			result.Add(combined);
			
			for(var x = endAt;x < intervals.Count; x++){
				result.Add(intervals[(int)x]);
			}
			return result;
		}
	}
	
	//new interval start is bigger than all intervals end, just put at end
	
	result.Add(newInterval);
	return result;
	
    }
}


相关文章:

  • 推荐WPF的好书
  • LeetCode -- Longest Valid Parentheses
  • 利用Intel博锐技术解决桌面管理难题
  • LeetCode -- Permutations
  • LeetCode -- Construct Binary Tree from Inorder and Postorder Traversal
  • 王小云:十年破译五部顶级密码
  • LeetCode -- Factorial Trailing Zeroes
  • LeetCode -- Gas Station
  • 山东大学王小云教授成功破解MD5
  • LeetCode -- Implement Trie (Prefix Tree)
  • 2009年的3G上网卡市场,华为将会领跑
  • LeetCode -- Kth Smallest Element in a BST
  • SQL2005CLR函数扩展-环比计算
  • LeetCode -- Majority Element
  • LeetCode -- Max Points on a Line
  • 「面试题」如何实现一个圣杯布局?
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • css属性的继承、初识值、计算值、当前值、应用值
  • ES6简单总结(搭配简单的讲解和小案例)
  • JSDuck 与 AngularJS 融合技巧
  • JS基础之数据类型、对象、原型、原型链、继承
  • LeetCode算法系列_0891_子序列宽度之和
  • mockjs让前端开发独立于后端
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • web标准化(下)
  • 爱情 北京女病人
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 坑!为什么View.startAnimation不起作用?
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 排序算法学习笔记
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 线上 python http server profile 实践
  • 最近的计划
  • postgresql行列转换函数
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • #微信小程序:微信小程序常见的配置传旨
  • (27)4.8 习题课
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (C语言)字符分类函数
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转) Android中ViewStub组件使用
  • (转)linux 命令大全
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net core 依赖注入的基本用发
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • @ConfigurationProperties注解对数据的自动封装
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @WebService和@WebMethod注解的用法
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [C/C++]数据结构 堆的详解