From 08fd5cb1a4ca10d2e99836d143ed20e98ee19806 Mon Sep 17 00:00:00 2001 From: Alex Scrobot Date: Sun, 9 Apr 2023 15:44:09 +0200 Subject: [PATCH 1/2] feat: added "Two Pointers" approach visualization --- Uncategorized/Two Pointers/README.md | 27 ++++++++++ Uncategorized/Two Pointers/code.js | 50 ++++++++++++++++++ .../Two Pointers/img/question_11.jpg | Bin 0 -> 18362 bytes 3 files changed, 77 insertions(+) create mode 100644 Uncategorized/Two Pointers/README.md create mode 100644 Uncategorized/Two Pointers/code.js create mode 100644 Uncategorized/Two Pointers/img/question_11.jpg diff --git a/Uncategorized/Two Pointers/README.md b/Uncategorized/Two Pointers/README.md new file mode 100644 index 00000000..9a21ec38 --- /dev/null +++ b/Uncategorized/Two Pointers/README.md @@ -0,0 +1,27 @@ +# Two Pointers + +Two pointers algorithm is a very useful technique in solving many problems, especially those that require scanning through arrays or lists. + +One practical example of using the two pointers algorithm is in finding pairs of numbers in an array that add up to a given target value. + +But, I prefer to provide example from the [leetcode](https://leetcode.com/problems/container-with-most-water/). + +![question_11.jpg](img%2Fquestion_11.jpg) + +``` +You are given an integer array height of length n. There are n vertical lines drawn such that the two endpoints of the ith line are (i, 0) and (i, height[i]). + +Find two lines that together with the x-axis form a container, such that the container contains the most water. + +Return the maximum amount of water a container can store. + +Notice that you may not slant the container. + +Input: height = [1,8,6,2,5,4,8,3,7] +Output: 49 +Explanation: The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49. +``` + +## Complexity +* **Time**: O(n) +* **Space**: O(1) \ No newline at end of file diff --git a/Uncategorized/Two Pointers/code.js b/Uncategorized/Two Pointers/code.js new file mode 100644 index 00000000..de32a7b3 --- /dev/null +++ b/Uncategorized/Two Pointers/code.js @@ -0,0 +1,50 @@ +const { Tracer, Array1DTracer, LogTracer, Layout, VerticalLayout } = require('algorithm-visualizer'); + +const tracer = new Array1DTracer('Input array'); +const areaTracer = new Array1DTracer('Max area calculation'); +const logger = new LogTracer(); + +Layout.setRoot(new VerticalLayout([tracer, areaTracer, logger])); + +function maxArea(height) { + tracer.set(height) + + let left = 0; + let right = height.length - 1; + let maxArea = 0; + + while (left < right) { + tracer.select(left); + tracer.select(right); + Tracer.delay(); + logger.println(`Checking area between ${left} and ${right}`); + + const h = Math.min(height[left], height[right]); + areaTracer.patch(0, h) + Tracer.delay(); + + const w = right - left; + areaTracer.patch(1, h) + Tracer.delay(); + + const area = h * w; + maxArea = Math.max(maxArea, area); + + areaTracer.patch(2, maxArea) + Tracer.delay(); + + tracer.deselect(left, right) + Tracer.delay(); + + if (height[left] < height[right]) { + left++; + } else { + right--; + } + } + + return maxArea; +} + +const height1 = [1,8,6,2,5,4,8,3,7]; +console.log(maxArea(height1)); // Output: 49 \ No newline at end of file diff --git a/Uncategorized/Two Pointers/img/question_11.jpg b/Uncategorized/Two Pointers/img/question_11.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7661efe42a9c4659500f272b4b6935f6fa031836 GIT binary patch literal 18362 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 V8G7N%`U{oAwQiU*77lvg{{a>dShfHF literal 0 HcmV?d00001 From 4d23ef06ecd91b6a67cddf0ed9cd001d497d29d7 Mon Sep 17 00:00:00 2001 From: Alex Scrobot Date: Mon, 10 Apr 2023 10:25:53 +0200 Subject: [PATCH 2/2] Update README.md --- Uncategorized/Two Pointers/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Uncategorized/Two Pointers/README.md b/Uncategorized/Two Pointers/README.md index 9a21ec38..1d8a6ccd 100644 --- a/Uncategorized/Two Pointers/README.md +++ b/Uncategorized/Two Pointers/README.md @@ -24,4 +24,8 @@ Explanation: The above vertical lines are represented by array [1,8,6,2,5,4,8,3, ## Complexity * **Time**: O(n) -* **Space**: O(1) \ No newline at end of file +* **Space**: O(1) + +## References: + +* [DSA: Two-pointers algorithm. Review with the step-by-step guide](https://medium.com/@alexeyskrobot/dsa-two-pointers-algorithm-review-with-the-step-by-step-guide-e8368e11a144)