Skip to content

Implemented minimum steps to one using tabulation. #3911

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Dec 9, 2020
Merged
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions dynamic_programming/minimum_steps_to_one.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
"""
YouTube Explanation: https://www.youtube.com/watch?v=f2xi3c1S95M

Given an integer n, return the minimum steps to 1

AVAILABLE STEPS:
* Decrement by 1
* if n is divisible by 2, divide by 2
* if n is divisible by 3, divide by 3


Example 1: n = 10
10 -> 9 -> 3 -> 1
Result: 3 steps

Example 2: n = 15
15 -> 5 -> 4 -> 2 -> 1
Result: 4 steps

Example 3: n = 6
6 -> 2 -> 1
Result: 2 step
"""

from __future__ import annotations

__author__ = "Alexander Joslin"


def min_steps_to_one(number: int) -> int:
"""
Implemented using tabulation.

DocTests
>>> min_steps_to_one(10)
3

>>> min_steps_to_one(15)
4

>>> min_steps_to_one(6)
2

:param n:
:return int:
"""

if number <= 0:
raise ValueError(f"n must be greater than 0. Got n = {number}")

table = [number + 1] * (number + 1)

# starting position
table[1] = 0
for i in range(1, number):
table[i + 1] = min(table[i + 1], table[i] + 1)
# check if out of bounds
if i * 2 <= number:
table[i * 2] = min(table[i * 2], table[i] + 1)
# check if out of bounds
if i * 3 <= number:
table[i * 3] = min(table[i * 3], table[i] + 1)
return table[number]


if __name__ == "__main__":
import doctest

doctest.testmod()