using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace ArrayQuestions
{
[TestClass]
public class MyCalender2Test
{
[TestMethod]
public void TestMethod1()
{
MyCalendarTwo myCalendar = new MyCalendarTwo();
Assert.IsTrue(myCalendar.Book(10, 20)); // returns true
Assert.IsTrue(myCalendar.Book(50, 60)); // returns true
Assert.IsTrue(myCalendar.Book(10, 40)); // returns true
Assert.IsFalse(myCalendar.Book(5, 15)); // returns false
Assert.IsTrue(myCalendar.Book(5, 10)); // returns true
Assert.IsTrue(myCalendar.Book(25, 55)); // returns true
}
}
public class MyCalendarTwo
{
private SortedDictionary<int, int> _dict;
public MyCalendarTwo()
{
_dict = new SortedDictionary<int, int>();
}
/// <summary>
/// foreach start you add a pair of (start,1)
/// foreach end you add a pair of (end,-1)
/// the list is sorted we add and remove events.
/// if we can more then 3 events added at the same time.
/// we need to remove the event
/// </summary>
/// <param name="start"></param>
/// <param name="end"></param>
/// <returns></returns>
public bool Book(int start, int end)
{
// s1------e1
// s-----e
// s---e
// s------------e
// s---------e
//s--e good
// s--e
if(!_dict.TryGetValue(start, out var temp))
{
_dict.Add(start, temp + 1);
}
else
{
_dict[start]++;
}
if (!_dict.TryGetValue(end, out var temp1))
{
_dict.Add(end, temp1 - 1);
}
else
{
_dict[end]--;
}
int active = 0;
foreach (var d in _dict.Values)
{
active += d;
if (active >= 3)
{
_dict[start]--;
_dict[end]++;
if (_dict[start] == 0)
{
_dict.Remove(start);
}
if (_dict[end] == 0)
{
_dict.Remove(end);
}
return false;
}
}
return true;
}
}
/**
* Your MyCalendarTwo object will be instantiated and called as such:
* MyCalendarTwo obj = new MyCalendarTwo();
* bool param_1 = obj.Book(start,end);
*/
}