From b73ddec94d5cbc95f923c0bc996717cb6907dc3c Mon Sep 17 00:00:00 2001 From: Oleksii Trekhleb Date: Sat, 14 Jul 2018 11:08:19 +0300 Subject: [PATCH] Add Pascal's Triangle based solution for Unique Paths problem. --- README.md | 2 +- src/algorithms/uncategorized/unique-paths/README.md | 7 +++++++ .../unique-paths/__test__/uniquePaths.test.js | 12 ++++++++++++ .../uncategorized/unique-paths/uniquePaths.js | 13 +++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/algorithms/uncategorized/unique-paths/__test__/uniquePaths.test.js create mode 100644 src/algorithms/uncategorized/unique-paths/uniquePaths.js diff --git a/README.md b/README.md index 7f052a16..d9ea8ea2 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ a set of rules that precisely define a sequence of operations. * `B` [Tower of Hanoi](src/algorithms/uncategorized/hanoi-tower) * `B` [Square Matrix Rotation](src/algorithms/uncategorized/square-matrix-rotation) - in-place algorithm * `B` [Jump Game](src/algorithms/uncategorized/jump-game) - backtracking, dynamic programming (top-down + bottom-up) and greedy examples - * `B` [Unique Paths](src/algorithms/uncategorized/unique-paths) - backtracking and dynamic programming examples + * `B` [Unique Paths](src/algorithms/uncategorized/unique-paths) - backtracking, dynamic programming and Pascal's Triangle based examples * `A` [N-Queens Problem](src/algorithms/uncategorized/n-queens) * `A` [Knight's Tour](src/algorithms/uncategorized/knight-tour) diff --git a/src/algorithms/uncategorized/unique-paths/README.md b/src/algorithms/uncategorized/unique-paths/README.md index f40bb817..924c97ba 100644 --- a/src/algorithms/uncategorized/unique-paths/README.md +++ b/src/algorithms/uncategorized/unique-paths/README.md @@ -94,6 +94,13 @@ the bottom right one with number `3`. **Auxiliary Space Complexity**: `O(m * n)` - since we need to have DP matrix. +### Pascal's Triangle Based + +This question is actually another form of Pascal Triangle. + +The corner of this rectangle is at `m + n - 2` line, and +at `min(m, n) - 1` position of the Pascal's Triangle. + ## References - [LeetCode](https://leetcode.com/problems/unique-paths/description/) diff --git a/src/algorithms/uncategorized/unique-paths/__test__/uniquePaths.test.js b/src/algorithms/uncategorized/unique-paths/__test__/uniquePaths.test.js new file mode 100644 index 00000000..da152b31 --- /dev/null +++ b/src/algorithms/uncategorized/unique-paths/__test__/uniquePaths.test.js @@ -0,0 +1,12 @@ +import uniquePaths from '../uniquePaths'; + +describe('uniquePaths', () => { + it('should find the number of unique paths on board', () => { + expect(uniquePaths(3, 2)).toBe(3); + expect(uniquePaths(7, 3)).toBe(28); + expect(uniquePaths(3, 7)).toBe(28); + expect(uniquePaths(10, 10)).toBe(48620); + expect(uniquePaths(100, 1)).toBe(1); + expect(uniquePaths(1, 100)).toBe(1); + }); +}); diff --git a/src/algorithms/uncategorized/unique-paths/uniquePaths.js b/src/algorithms/uncategorized/unique-paths/uniquePaths.js new file mode 100644 index 00000000..c39b6599 --- /dev/null +++ b/src/algorithms/uncategorized/unique-paths/uniquePaths.js @@ -0,0 +1,13 @@ +import pascalTriangle from '../../math/pascal-triangle/pascalTriangle'; + +/** + * @param {number} width + * @param {number} height + * @return {number} + */ +export default function uniquePaths(width, height) { + const pascalLine = width + height - 2; + const pascalLinePosition = Math.min(width, height) - 1; + + return pascalTriangle(pascalLine)[pascalLinePosition]; +}