From 4209a0655c5db628fcd22b1019c3323169ec5228 Mon Sep 17 00:00:00 2001 From: Adrian Mejia Date: Wed, 9 Sep 2020 07:41:51 -0400 Subject: [PATCH] --wip-- [skip ci] --- book/D-interview-questions-solutions.asc | 84 ++++++++++++++++++ book/content/part04/sorting-algorithms.asc | 74 +++++++++++++++ book/images/merge-intervals-cases.png | Bin 0 -> 28966 bytes .../merge-intervals-cases.png:Zone.Identifier | 0 book/interview-questions/merge-intervals.js | 27 ++++++ .../merge-intervals.spec.js | 30 +++++++ 6 files changed, 215 insertions(+) create mode 100644 book/images/merge-intervals-cases.png create mode 100644 book/images/merge-intervals-cases.png:Zone.Identifier create mode 100644 book/interview-questions/merge-intervals.js create mode 100644 book/interview-questions/merge-intervals.spec.js diff --git a/book/D-interview-questions-solutions.asc b/book/D-interview-questions-solutions.asc index d7228268..fb9b27c1 100644 --- a/book/D-interview-questions-solutions.asc +++ b/book/D-interview-questions-solutions.asc @@ -843,6 +843,90 @@ This algorithm only works with DFS. // +:leveloffset: +1 + +=== Solutions for Sorting Questions +(((Interview Questions Solutions, sorting))) + +:leveloffset: -1 + + +[#sorting-q-merge-intervals] +include::content/part03/sorting-algorithms.asc[tag=sorting-q-merge-intervals] + +The first thing we need to understand is all the different possibilities for overlaps: + +image::merge-intervals-cases.png[merge intervals cases] + +One way to solve this problem, is sorting by start time. That will eliminate half of the cases! + +Since A will always start before B, only 3 cases apply: +- No overlap: `[[1, 3], [4, 6]]`. +- Overlap at the end: `[[1, 3], [2, 4]]`. +- Eclipse: `[[1, 9], [3, 7]]`. + +*Algorithm*: + +* Sort intervals by start time +* If the `curr`ent interval's start time is _equal_ or less than the `last` interval's end time, then we have an overlap. +** Overlaps has two cases: 1) `curr`'s end is larger 2) `last`'s end is larger. For both cases `Math.max` works. +* If there's no overlap, we add the interval to the solution. + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/merge-intervals.js[tags=description;solution] +---- + +For the first interval, it will be added straight to the solution array. For all others, we will do the comparison. + +*Complexity Analysis*: + +- Time: `O(n log n)`. Standard libraries has a sorting time of `O(n log n)`, then we visit each interval in `O(n)`. +- Space: `O(n)`. In the worst-case is when there's no overlapping intervals. The size of the solution array would be `n`. + + + + + + + +// + +[#sorting-q-FILENAME] +include::content/part03/sorting-algorithms.asc[tag=sorting-q-FILENAME] + +RESTATE REQUIREMENTS AND DESCRIPTIONS + +*Algorithm*: + +* STEP 1 +* STEP 2 +** STEP 2.1 +** STEP 2.2 + +*Implementation*: + +[source, javascript] +---- +include::interview-questions/FILENAME.js[tags=description;solution] +---- + +IMPLEMENTATION NOTES + +*Complexity Analysis*: + +- Time: `O(?)`. WHY? +- Space: `O(?)`. WHY? + + + + + + + +// diff --git a/book/content/part04/sorting-algorithms.asc b/book/content/part04/sorting-algorithms.asc index 67ea34a4..5a8f21a4 100644 --- a/book/content/part04/sorting-algorithms.asc +++ b/book/content/part04/sorting-algorithms.asc @@ -139,3 +139,77 @@ We explored many algorithms some of them simple and other more performant. Also, // | Tim sort | O(n log n) | O(log n) | Yes | No | No | Yes |=== // end::table[] + + + + + + + + + +==== Practice Questions +(((Interview Questions, sorting))) + + + + + +// tag::sorting-q-merge-intervals[] +===== TITLE + +*so-1*) _Given an array of intervals `[start, end]`, merge all overlapping intervals._ + +// end::sorting-q-merge-intervals[] + +// _Seen in interviews at: X._ + +*Starter code*: + +[source, javascript] +---- +include::../../interview-questions/merge-intervals.js[tags=description;placeholder] +---- + +*Examples*: + +[source, javascript] +---- +merge([[0, 2], [2, 4]]); // [[0, 4]] (0-2 overlaps with 2-4) +merge([[2, 2], [3, 4]]); // [[2, 2], [3, 4]] (no overlap) +merge([[1, 10], [3, 4]]); // [[1, 10]] (1-10 covers the other) +---- + + +_Solution: <>_ + + + + + + +// tag::sorting-q-FILENAME[] +===== TITLE + +*sorting_INITIALS-NUMBER*) _._ + +// end::sorting-q-FILENAME[] + +// _Seen in interviews at: X._ + +*Starter code*: + +[source, javascript] +---- +include::../../interview-questions/FILENAME.js[tags=description;placeholder] +---- + +*Examples*: + +[source, javascript] +---- +FN([]); // 3 (EXPLANATION) +---- + + +_Solution: <>_ diff --git a/book/images/merge-intervals-cases.png b/book/images/merge-intervals-cases.png new file mode 100644 index 0000000000000000000000000000000000000000..574438a9f7a35709b47ef8424a533075f2ba1e3a GIT binary patch literal 28966 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 literal 0 HcmV?d00001 diff --git a/book/images/merge-intervals-cases.png:Zone.Identifier b/book/images/merge-intervals-cases.png:Zone.Identifier new file mode 100644 index 00000000..e69de29b diff --git a/book/interview-questions/merge-intervals.js b/book/interview-questions/merge-intervals.js new file mode 100644 index 00000000..3c62d5cc --- /dev/null +++ b/book/interview-questions/merge-intervals.js @@ -0,0 +1,27 @@ +// const { } = require('../../src/index'); + +// tag::description[] +function merge(intervals) { + // end::description[] + // tag::placeholder[] + // write your code here... + // end::placeholder[] + // tag::solution[] + const ans = []; + + intervals.sort((a, b) => a[0] - b[0]); // sort by start time + + for (let i = 0; i < intervals.length; i++) { + const last = ans[ans.length - 1]; + const curr = intervals[i]; + if (last && last[1] >= curr[0]) { // check for overlaps + last[1] = Math.max(last[1], curr[1]); + } else ans.push(curr); + } + return ans; + // end::solution[] + // tag::description[] +} +// end::description[] + +module.exports = { merge }; diff --git a/book/interview-questions/merge-intervals.spec.js b/book/interview-questions/merge-intervals.spec.js new file mode 100644 index 00000000..da875e4d --- /dev/null +++ b/book/interview-questions/merge-intervals.spec.js @@ -0,0 +1,30 @@ +const { merge } = require('./merge-intervals'); +// const { } = require('../../src/index'); + +[merge].forEach((fn) => { + describe(`TOPIC: ${fn.name}`, () => { + it('should work with null/empty', () => { + const actual = fn([]); + const expected = []; + expect(actual).toEqual(expected); + }); + + it('should work with small case', () => { + const actual = fn([[1, 3]]); + const expected = [[1, 3]]; + expect(actual).toEqual(expected); + }); + + it('should work with other case', () => { + const actual = fn([[0, 1], [1, 3], [3, 5], [6, 6]]); + const expected = [[0, 5], [6, 6]]; + expect(actual).toEqual(expected); + }); + + it('should work with other case', () => { + const actual = fn([[10, 99], [20, 50], [9, 11], [98, 100]]); + const expected = [[9, 100]]; + expect(actual).toEqual(expected); + }); + }); +});