diff --git a/insert-interval/nhistory.js b/insert-interval/nhistory.js new file mode 100644 index 000000000..305248b68 --- /dev/null +++ b/insert-interval/nhistory.js @@ -0,0 +1,29 @@ +var insert = function (intervals, newInterval) { + let result = []; + let i = 0; + + // 1. Add all intervals before the new interval + while (i < intervals.length && intervals[i][1] < newInterval[0]) { + result.push(intervals[i]); + i++; + } + + // 2. Merge all overlapping intervals with new interval + while (i < intervals.length && intervals[i][0] <= newInterval[1]) { + newInterval[0] = Math.min(newInterval[0], intervals[i][0]); + newInterval[1] = Math.max(newInterval[1], intervals[i][1]); + i++; + } + result.push(newInterval); + + // 3. Add all intervals after the new interval + while (i < intervals.length && intervals[i][1] >= newInterval[0]) { + result.push(intervals[i]); + i++; + } + + return result; +}; + +// TC = O(n) +// SC = O(n) diff --git a/meeting-rooms-ii/nhistory.js b/meeting-rooms-ii/nhistory.js new file mode 100644 index 000000000..0e08afc77 --- /dev/null +++ b/meeting-rooms-ii/nhistory.js @@ -0,0 +1,29 @@ +class Solution { + /** + * @param {Interval[]} intervals + * @returns {number} + */ + minMeetingRooms(intervals) { + // Edge case + if (intervals.length === 0) return 0; + + let startTimes = intervals.map((interval) => interval.start); + let endTimes = intervals.map((interval) => interval.end); + + startTimes.sort((a, b) => a - b); + endTimes.sort((a, b) => a - b); + + let roomNeeded = 0; + let endIndex = 0; + + for (let i = 0; i < intervals.length; i++) { + if (startTimes[i] < endTimes[endIndex]) roomNeeded++; + else endIndex++; + } + + return roomNeeded; + } +} + +// TC: O(nlogn) +// SC: O(n) diff --git a/merge-intervals/nhistory.js b/merge-intervals/nhistory.js new file mode 100644 index 000000000..623eb2b52 --- /dev/null +++ b/merge-intervals/nhistory.js @@ -0,0 +1,22 @@ +var merge = function (intervals) { + // Sort intervals with first start number + intervals.sort((a, b) => a[0] - b[0]); + let result = []; + let currentInterval = intervals[0]; + + for (let i = 1; i < intervals.length; i++) { + if (currentInterval[1] >= intervals[i][0]) { + currentInterval[1] = Math.max(currentInterval[1], intervals[i][1]); + } else { + result.push(currentInterval); + currentInterval = intervals[i]; + } + } + + result.push(currentInterval); + + return result; +}; + +// TC: O(nlogn) +// SC: O(n) diff --git a/non-overlapping-intervals/nhistory.js b/non-overlapping-intervals/nhistory.js new file mode 100644 index 000000000..38763eaea --- /dev/null +++ b/non-overlapping-intervals/nhistory.js @@ -0,0 +1,18 @@ +var eraseOverlapIntervals = function (intervals) { + let count = 0; + intervals.sort((a, b) => a[1] - b[1]); + let currentEnd = intervals[0][1]; + + for (let i = 1; i < intervals.length; i++) { + if (currentEnd > intervals[i][0]) { + count++; + } else { + currentEnd = intervals[i][1]; + } + } + + return count; +}; + +// TC: O(nlogn) +// SC: O(1) diff --git a/rotate-image/nhistory.js b/rotate-image/nhistory.js new file mode 100644 index 000000000..83a46758e --- /dev/null +++ b/rotate-image/nhistory.js @@ -0,0 +1,23 @@ +var rotate = function (matrix) { + let top = 0, + bottom = matrix.length - 1; + let left, right; + + while (top < bottom) { + (left = top), (right = bottom); + + for (let i = 0; i < bottom - top; i++) { + const topLeft = matrix[top][left + i]; + matrix[top][left + i] = matrix[bottom - i][left]; + matrix[bottom - i][left] = matrix[bottom][right - i]; + matrix[bottom][right - i] = matrix[top + i][right]; + matrix[top + i][right] = topLeft; + } + + top++; + bottom--; + } +}; + +// TC: O(n^2) +// SC: O(1)